🔥 Горящие вакансии
Все статьи

Как заполнить строку табличной части на сервере без контекста в 1С

Эту и другие технические статьи написали наши программисты 1С и получили за них премии. Если вы тоже работаете с 1С и любите делиться опытом, приходите разработчиком в Neti

Цель данной статьи показать, как работать со строкой табличной части на сервере без контекста.

Все знают, что серверные без контекстные вызовы намного «легче» серверных вызовов и их использование является оптимальным решением задач. Но иногда программист, не задумываясь о последствиях использует серверный вызов в тех случаях, когда можно было использовать серверный без контекстный вызов, уменьшив тем самым нагрузку на сервер и увеличив производительность системы. Если на форме содержится мало данных, то разница будет почти не заметна и в таком случае неверное нет смысла усложнять код. Но в случае, когда данных много, разница будет очевидна и написанный серверный код нужно будет переделывать.

Разберем случай, когда для решения поставленной задачи нам нужно на сервере обратиться к данным текущей строки. При этом мы будем использовать серверный без контекстный вызов, а потом результаты сравним с серверным вызовом. В качестве демонстрации возьмем простой пример: при изменении номенклатуры получим ее единицу измерения.

Передача типа ДанныеФормыЭлементКоллекции на сервер невозможна:

Как заполнить строку табличной части на сервере без контекста в 1С

Оптимальным решением передать текущую строку на сервер будет преобразовать ее в структуру и уже структуру передать на сервер, а уже после выполнения действий со структурой перезаполнить данные текущей строки. Программный код будет выглядеть так:

////////
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
	
	ИндексСтроки = Элементы.Товары.ТекущаяСтрока;
// Преобразуем данные текущей строки в структуру
	ДанныеТекущейСтроки = ПреобразоватьДанныеТекущейСтрокиВСтруктуру();
// Получим интересующее нас значение
	ЗаполнитьЕдиницуИзмеренияНоменклатуры(ДанныеТекущейСтроки);
// Изменим значения реквизитов текущей строки
	ЗаполнитьЗначенияСвойств(Объект.Товары[ИндексСтроки], ДанныеТекущейСтроки, "Упаковка");
КонецПроцедуры
&НаКлиенте
Функция ПреобразоватьДанныеТекущейСтрокиВСтруктуру() Экспорт
	
	Результат = Новый Структура("Номенклатура, Упаковка");
	
	ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если НЕ ТекущиеДанные = Неопределено Тогда
		
		ЗаполнитьЗначенияСвойств(Результат, ТекущиеДанные);
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервереБезКонтекста
Процедура ЗаполнитьЕдиницуИзмеренияНоменклатуры(ДанныеТекущейСтроки)

	ДанныеТекущейСтроки.Упаковка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДанныеТекущейСтроки.Номенклатура, "ЕдиницаИзмерения");	

КонецПроцедуры
////////

• ПреобразоватьДанныеТекущейСтрокиВСтруктуру() – на основании данных текущей строки создается и заполняется структура с теми реквизитами табличной части, которые нам понадобятся для решения задачи.

• ИндексСтроки = Элементы.Товары.ТекущаяСтрока; – получаем идентификатор текущей строки таблицы

• ЗаполнитьЕдиницуИзмеренияНоменклатуры(ДанныеТекущейСтроки); — серверный без контекстный вызов, обращение к БД, поиск единицы измерения номенклатуры. Найденное значение помещается в структуру.

• ЗаполнитьЗначенияСвойств(Объект.Товары[ИндексСтроки], ДанныеТекущейСтроки, «Упаковка»); — изменяем значение «Упаковка» в текущей строке табличной части

А теперь с помощью замера производительности сравним время выполнения данной задачи и сравним время выполнения через серверный вызов. Чтобы увидеть разницу заполняем табличную часть формы данными.

Первый замер — серверный без контекстный вызов: 0,013694, второй замер – серверный вызов: 0,047071.

Оставить коментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Отправить резюме

    Я согласен на обработку персональных данных в соответствии
    со ст. 9 ФЗ № 152-ФЗ «О персональных данных»

    Отправить резюме

      Я согласен на обработку персональных данных в соответствии
      со ст. 9 ФЗ № 152-ФЗ «О персональных данных»

      Pекомендовать друга

        Отправьте контактные данные вашего друга и предупредите его, что мы с ним свяжемся. Когда друг успешно отработает 3 месяца, вы получите 20 000 ₽.


        Выбрать вакансию
        • Bitrix-разработчик
        • Программист 1С
        • Консультант-аналитик 1С
        • Проекты для команды специалистов 1С
        • Проекты для специалистов 1С
        • Стажёр-программист 1С
        • Ведущий консультант Microsoft Dynamics 365 Sales
        • Руководитель проектов Microsoft Dynamics 365 FO и AX 2012
        • Консультант Microsoft Dynamics AX на зарубежные проекты
        • Ведущий консультант Microsoft Dynamics 365 Finance and Operation
        • Ведущий разработчик Microsoft Dynamics AX на зарубежные проекты
        Я согласен на обработку персональных данных в соответствии
        со ст. 9 ФЗ № 152-ФЗ «О персональных данных»

        Pекомендовать друга

          Отправьте контактные данные вашего друга и предупредите его, что мы с ним свяжемся. Когда друг успешно отработает 3 месяца, вы получите 20 000 ₽.


          Выбрать вакансию
          • Bitrix-разработчик
          • Программист 1С
          • Консультант-аналитик 1С
          • Проекты для команды специалистов 1С
          • Проекты для специалистов 1С
          • Стажёр-программист 1С
          • Ведущий консультант Microsoft Dynamics 365 Sales
          • Руководитель проектов Microsoft Dynamics 365 FO и AX 2012
          • Консультант Microsoft Dynamics AX на зарубежные проекты
          • Ведущий консультант Microsoft Dynamics 365 Finance and Operation
          • Ведущий разработчик Microsoft Dynamics AX на зарубежные проекты
          Я согласен на обработку персональных данных в соответствии
          со ст. 9 ФЗ № 152-ФЗ «О персональных данных»

          Спасибо!

          Мы получили ваше резюме. Менеджер свяжется с вами в течение трех дней

          Горящие вакансии