Как вывести артикул номенклатуры в документе Корректировка записей регистров в 1С?

Программист 1С v8.3 (Обычные формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

При работе с документом Корректировка записей регистров в конфигурациях на обычных формах (таких как 1С:Комплексная автоматизация 1.1 или 1С:Управление производственным предприятием 1.3) часто возникает необходимость отобразить пользователю дополнительные реквизиты номенклатуры — например, Артикул или Код. Однако при попытке просто добавить колонку в табличное поле разработчики сталкиваются с тем, что значения в ячейках дублируются, затираются при потере фокуса или вовсе не сохраняются.

Разберем по шагам, почему возникает такое поведение платформы и как правильно реализовать вывод расчетной колонки с артикулом без потери производительности системы.

Выясним причину проблемы

Проанализируем архитектуру отображения движений в документе КорректировкаЗаписейРегистров. Источником данных для табличных полей на форме является не табличная часть документа и не произвольная таблица значений, а объект НаборЗаписей соответствующего регистра (накопления или сведений).

Рассмотрим ключевые особенности работы набора записей в табличном поле:

  1. Фиксированная структура данных: состав колонок набора записей строго ограничен измерениями, ресурсами и реквизитами регистра, заданными в дереве метаданных.
  2. Отсутствие привязки к данным: если добавить колонку в табличное поле вручную или программно, ее свойство Данные остается пустым, так как в регистре нет поля Артикул. Платформа 1С не сохраняет состояние таких несвязанных ячеек.
  3. Особенности отрисовки: при обычном цикле обхода строк присвоенные значения сбрасываются при любой перерисовке таблицы, сортировке или скроллинге списка.

Единственным корректным способом отображения вычисляемых данных в таком табличном поле является использование специализированных событий динамического вывода строк.

Решение: программное добавление колонки и обработка события ПриПолученииДанных

Посмотрим на алгоритм реализации. Поскольку страницы с регистрами и их табличные поля в документе создаются динамически при переключении или открытии формы, нам необходимо подключить обработчик события ПриПолученииДанных.

Разберем по шагам, как настроить отображение артикула:

  1. Создание колонки: в модуле формы документа находим процедуру инициализации страниц и табличных полей регистров. Программно добавляем колонку для отображения артикула.
  2. Подключение обработчика: связываем табличное поле с процедурой события ПриПолученииДанных с помощью метода УстановитьДействие.
  3. Оптимальная выборка данных: в обработчике собираем ссылки на номенклатуру только по тем строкам, которые в текущий момент отображаются на экране (коллекция ОформленияСтрок), выполняем один пакетный запрос к базе данных и заполняем текст ячеек.

Рассмотрим пример программного добавления колонки и назначения действия:


// Добавление колонки в табличное поле нужного регистра
КолонкаАртикул = ЭлементыФормы.ТабличноеПолеРегистра.Колонки.Вставить(0, "Артикул");
КолонкаАртикул.Заголовок = "Артикул";
КолонкаАртикул.Ширина = 12;
КолонкаАртикул.РежимРедактирования = РежимРедактированияКолонки.НеРедактировать;

// Назначение обработчика динамического вывода
ЭлементыФормы.ТабличноеПолеРегистра.УстановитьДействие("ПриПолученииДанных", Новый Действие("ТабличноеПолеРегистраПриПолученииДанных"));

Теперь реализуем сам обработчик события ПриПолученииДанных. Обратите внимание, что мы получаем данные сразу пакетом, избегая запросов в цикле:


Процедура ТабличноеПолеРегистраПриПолученииДанных(Элемент, ОформленияСтрок)
    
    // 1. Собираем массив уникальных ссылок на номенклатуру из видимых строк
    МассивНоменклатуры = Новый Массив;
    
    Для Каждого Оформление Из ОформленияСтрок Цикл
        ДанныеСтроки = Оформление.ДанныеСтроки;
        Если ДанныеСтроки <> Неопределено И ЗначениеЗаполнено(ДанныеСтроки.Номенклатура) Тогда
            МассивНоменклатуры.Добавить(ДанныеСтроки.Номенклатура);
        КонецЕсли;
    КонецЦикла;
    
    Если МассивНоменклатуры.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    // 2. Получаем артикулы одним запросом
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Номенклатура.Ссылка КАК Номенклатура,
        |	Номенклатура.Артикул КАК Артикул
        |ИЗ
        |	Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |	Номенклатура.Ссылка В(&МассивНоменклатуры)";
    
    Запрос.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры);
    Выборка = Запрос.Выполнить().Выбрать();
    
    СоответствиеАртикулов = Новый Соответствие;
    Пока Выборка.Следующий() Цикл
        СоответствиеАртикулов.Вставить(Выборка.Номенклатура, Выборка.Артикул);
    КонецЦикла;
    
    // 3. Устанавливаем текст в ячейки добавленной колонки
    Для Каждого Оформление Из ОформленияСтрок Цикл
        ДанныеСтроки = Оформление.ДанныеСтроки;
        Если ДанныеСтроки <> Неопределено Тогда
            НайденныйАртикул = СоответствиеАртикулов[ДанныеСтроки.Номенклатура];
            Если НайденныйАртикул <> Неопределено Тогда
                Оформление.Ячейки.Артикул.УстановитьТекст(НайденныйАртикул);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Альтернативный вариант: модификация стандартной ячейки Номенклатура

Если нет жесткого требования выводить артикул отдельным столбцом, рассмотрим еще один удобный вариант — модифицировать выводимое представление в стандартной колонке Номенклатура.

В этом случае добавлять новую колонку не требуется, достаточно в процедуре ПриПолученииДанных изменить текст существующей ячейки:


Для Каждого Оформление Из ОформленияСтрок Цикл
    ДанныеСтроки = Оформление.ДанныеСтроки;
    Если ДанныеСтроки <> Неопределено Тогда
        НайденныйАртикул = СоответствиеАртикулов[ДанныеСтроки.Номенклатура];
        Если ЗначениеЗаполнено(НайденныйАртикул) Тогда
            // Формируем комбинированное представление
            НовыйТекст = "[" + СокрЛП(НайденныйАртикул) + "] " + Строка(ДанныеСтроки.Номенклатура);
            Оформление.Ячейки.Номенклатура.УстановитьТекст(НовыйТекст);
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Важные ограничения и рекомендации

При использовании вычисляемых колонок в табличных полях обычных форм необходимо помнить о следующих правилах платформы:

  1. Сортировка и отборы: стандартные механизмы платформы не позволяют выполнять интерактивную сортировку или устанавливать отбор по колонкам, значения которых формируются в событиях отрисовки.
  2. Производительность: не используйте обращение через точку вида ДанныеСтроки.Номенклатура.Артикул в событии ПриВыводеСтроки. Такое обращение вызывает неявный одиночный запрос к СУБД для каждой выводимой строки, что приводит к зависанию интерфейса при быстром скроллинге. Использование события ПриПолученииДанных с пакетной выборкой гарантирует максимальное быстродействие.
← На главную