Контекст - "дело тонкое"

Контекст в 1С: особенности работы и оптимизация производительности

Контекст в 1С: особенности работы и оптимизация производительности

Что такое контекст и почему он важен

Контекст в 1С - это совокупность данных и состояний, доступных в текущей точке выполнения программы. Он включает переменные, параметры, свойства формы и другие элементы, которые могут влиять на выполнение кода. Контекст важен потому, что:

  • Определяет доступные методы и свойства объектов
  • Влияет на производительность при клиент-серверном взаимодействии
  • Обеспечивает корректную работу подсказок в конфигураторе
  • Может содержать большие объемы данных, что сказывается на скорости работы

1. Контекстная подсказка в конфигураторе

Для удобства программирования можно наполнить контекстную подсказку недостающими подсказками. Если происходит обращение к разименованной переменной (переменная, которая явно не инициализируется в теле метода), контекстная подсказка часто бывает недоступна.

#Если ДобавлениеКонтекста Тогда Документ = Документы.РеализацияТоваровУслуг.СоздатьДокумент(); #КонецЕсли

Такой код не будет скомпилирован из-за несуществующей директивы компиляции, но в конфигураторе контекстная подсказка будет корректно отображать доступные свойства и методы.

"ДобавлениеКонтекста" может быть любое слово, главное не использовать поддерживаемые директивы.

2. Контекст в клиент-серверном взаимодействии

Передача контекста между сервером и клиентом создает дополнительные накладные расходы. Каждый раз при вызове серверного метода платформа сериализует (преобразует в передаваемый формат) весь контекст формы и передает его на сервер, а после выполнения - десериализует обратно. Это может значительно снижать производительность, особенно при работе с большими формами или частыми вызовами.

&НаСервереБезКонтекста Функция ОбработатьДанные(Знач ДанныеДляОбработки)

"Знач" (передача по значению) - ограничивает передачу данных аргумента обратно из метода, уменьшая объем клиент-серверного взаимодействия, так как не происходит обратной сериализации аргумента с сервера на клиент.

Другие безконтекстные директивы компиляции:

  • &Клиент - исполнение на клиенте без контекста формы
  • &НаКлиентеНаСервереБезКонтекста - метод генерируется и на клиенте, и на сервере без контекста

3. Безконтекстное обращение к модулю внешней обработки

Обычное обращение к экспортным методам модуля внешней обработки:

Процедура ОбращениеКМодулюОбработки() ОбъектОбработки = РеквизитФормыВЗначение("Объект"); ОбъектОбработки.ЭкспортныйМетодМодуляОбъекта(); КонецПроцедуры

Если форма содержит много контекста, такие вызовы могут вызывать большие накладные расходы.

Оптимальный вариант - обращение к методу вне контекста:

&НаСервереБезКонтекста Процедура ОбращениеКМодулюОбработки() ОбъектОбработки = Новый("ВнешняяОбработкаОбъект.ИмяВнешнейОбработки"); ОбъектОбработки.ЭкспортныйМетодМодуляОбъекта(); КонецПроцедуры

4. Замена стандартной сериализации

По умолчанию при клиент-серверном взаимодействии происходит XDTO-сериализация объектов - универсальный, но медленный механизм преобразования данных.

&НаКлиенте Процедура Заполнить(Команда) СериализованныеДанные = ЗаполнитьСтроки(); ДанныеДляЗаполнения = ПрочитатьЗначениеJSON(СериализованныеДанные); Для каждого ЭлементДанных Из ДанныеДляЗаполнения Цикл НоваяСтрока = ТаблицаНаФорме.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементДанных); КонецЦикла; КонецПроцедуры &НаСервереБезКонтекста Функция ЗаполнитьСтроки() Результат = Новый Массив(); Для каждого Справочник Из Метаданные.Справочники Цикл Данные = Новый Структура("Имя, Синоним", Справочник.Имя, Справочник.Синоним); Результат.Добавить(Данные); КонецЦикла; ВозвращаемоеЗначение = ЗаписатьЗначениеJSON(Результат); Возврат ВозвращаемоеЗначение; КонецФункции

Примечание:

  • Функции ЗаписатьЗначениеJSON и ПрочитатьЗначениеJSON доступны с версии 8.3.23
  • Альтернатива - ЗаписатьJSON и ПрочитатьJSON (доступны с 8.3.6)
  • JSON не может сериализовать тип "Дата" - такие данные нужно предварительно преобразовать

5. Большие коллекции на форме

Перед закрытием формы, содержащей большие коллекции, необходимо очищать их в процедуре "ПередЗакрытием", особенно если в свойствах формы указано "Автоматическое сохранение данных в настройках". Это предотвратит ненужную сериализацию и сохранение больших объемов данных.

Процедура ПередЗакрытием(Отказ) // Очистка больших коллекций ТаблицаНаФорме.Очистить(); БольшаяКоллекцияДанных = Неопределено; КонецПроцедуры

Заключение

Правильная работа с контекстом в 1С позволяет:

  • Улучшить производительность приложений
  • Снизить нагрузку на клиент-серверное взаимодействие
  • Упростить разработку за счет корректных подсказок
  • Оптимизировать работу с большими объемами данных

Применение описанных методов особенно важно в крупных проектах с интенсивным клиент-серверным взаимодействием и формами, содержащими большие коллекции данных.

Комментарии

Популярные сообщения из этого блога

Удивительные коллекции 1С

Символы alt-кодов

Получение количества записей в таблицах MS SQL