Контекст - "дело тонкое"
Контекст в 1С: особенности работы и оптимизация производительности
Что такое контекст и почему он важен
Контекст в 1С - это совокупность данных и состояний, доступных в текущей точке выполнения программы. Он включает переменные, параметры, свойства формы и другие элементы, которые могут влиять на выполнение кода. Контекст важен потому, что:
- Определяет доступные методы и свойства объектов
- Влияет на производительность при клиент-серверном взаимодействии
- Обеспечивает корректную работу подсказок в конфигураторе
- Может содержать большие объемы данных, что сказывается на скорости работы
1. Контекстная подсказка в конфигураторе
Для удобства программирования можно наполнить контекстную подсказку недостающими подсказками. Если происходит обращение к разименованной переменной (переменная, которая явно не инициализируется в теле метода), контекстная подсказка часто бывает недоступна.
#Если ДобавлениеКонтекста Тогда
Документ = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
#КонецЕсли
Такой код не будет скомпилирован из-за несуществующей директивы компиляции, но в конфигураторе контекстная подсказка будет корректно отображать доступные свойства и методы.
"ДобавлениеКонтекста" может быть любое слово, главное не использовать поддерживаемые директивы.
2. Контекст в клиент-серверном взаимодействии
Передача контекста между сервером и клиентом создает дополнительные накладные расходы. Каждый раз при вызове серверного метода платформа сериализует (преобразует в передаваемый формат) весь контекст формы и передает его на сервер, а после выполнения - десериализует обратно. Это может значительно снижать производительность, особенно при работе с большими формами или частыми вызовами.
&НаСервереБезКонтекста
Функция ОбработатьДанные(Знач ДанныеДляОбработки)
"Знач" (передача по значению) - ограничивает передачу данных аргумента обратно из метода, уменьшая объем клиент-серверного взаимодействия, так как не происходит обратной сериализации аргумента с сервера на клиент.
Другие безконтекстные директивы компиляции:
&Клиент
- исполнение на клиенте без контекста формы&НаКлиентеНаСервереБезКонтекста
- метод генерируется и на клиенте, и на сервере без контекста
3. Безконтекстное обращение к модулю внешней обработки
Обычное обращение к экспортным методам модуля внешней обработки:
Процедура ОбращениеКМодулюОбработки()
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
ОбъектОбработки.ЭкспортныйМетодМодуляОбъекта();
КонецПроцедуры
Если форма содержит много контекста, такие вызовы могут вызывать большие накладные расходы.
Оптимальный вариант - обращение к методу вне контекста:
&НаСервереБезКонтекста
Процедура ОбращениеКМодулюОбработки()
ОбъектОбработки = Новый("ВнешняяОбработкаОбъект.ИмяВнешнейОбработки");
ОбъектОбработки.ЭкспортныйМетодМодуляОбъекта();
КонецПроцедуры
4. Замена стандартной сериализации
По умолчанию при клиент-серверном взаимодействии происходит XDTO-сериализация объектов - универсальный, но медленный механизм преобразования данных.
&НаКлиенте
Процедура Заполнить(Команда)
СериализованныеДанные = ЗаполнитьСтроки();
ДанныеДляЗаполнения = ПрочитатьЗначениеJSON(СериализованныеДанные);
Для каждого ЭлементДанных Из ДанныеДляЗаполнения Цикл
НоваяСтрока = ТаблицаНаФорме.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементДанных);
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗаполнитьСтроки()
Результат = Новый Массив();
Для каждого Справочник Из Метаданные.Справочники Цикл
Данные = Новый Структура("Имя, Синоним", Справочник.Имя, Справочник.Синоним);
Результат.Добавить(Данные);
КонецЦикла;
ВозвращаемоеЗначение = ЗаписатьЗначениеJSON(Результат);
Возврат ВозвращаемоеЗначение;
КонецФункции
Примечание:
- Функции
ЗаписатьЗначениеJSON
иПрочитатьЗначениеJSON
доступны с версии 8.3.23 - Альтернатива -
ЗаписатьJSON
иПрочитатьJSON
(доступны с 8.3.6) - JSON не может сериализовать тип "Дата" - такие данные нужно предварительно преобразовать
5. Большие коллекции на форме
Перед закрытием формы, содержащей большие коллекции, необходимо очищать их в процедуре "ПередЗакрытием", особенно если в свойствах формы указано "Автоматическое сохранение данных в настройках". Это предотвратит ненужную сериализацию и сохранение больших объемов данных.
Процедура ПередЗакрытием(Отказ)
// Очистка больших коллекций
ТаблицаНаФорме.Очистить();
БольшаяКоллекцияДанных = Неопределено;
КонецПроцедуры
Заключение
Правильная работа с контекстом в 1С позволяет:
- Улучшить производительность приложений
- Снизить нагрузку на клиент-серверное взаимодействие
- Упростить разработку за счет корректных подсказок
- Оптимизировать работу с большими объемами данных
Применение описанных методов особенно важно в крупных проектах с интенсивным клиент-серверным взаимодействием и формами, содержащими большие коллекции данных.
Комментарии
Отправить комментарий