Как передать значения из СпискаЗначений в ТаблицуЗначений во внешней печатной форме 1С 7.7?

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке внешних печатных форм (ВПФ) и дополнительных обработок в платформе 1С:Предприятие 7.7 разработчики нередко сталкиваются с ситуацией, когда данные, выбранные на форме обработки, не передаются в результирующую ТаблицуЗначений или печатную форму, возвращая пустые значения. Разберем детально, почему это происходит и как правильно организовать хранение и передачу настроек сопоставления данных.

Анализ причин проблемы

Проанализируем типичный сценарий: на форме внешней обработки размещены элементы управления типа СписокЗначений (например, для сопоставления мест хранения и ответственных сотрудников). При интерактивном открытии формы значения видны, однако при вызове обработки по кнопке «Печать» из документа формируются пустые строки. Выясним главные причины такого поведения:

  1. Фоновый контекст исполнения ВПФ: При формировании внешней печатной формы из документа типовой механизм платформы загружает обработку программно, не открывая её диалоговое окно. Элементы диалога не инициализируются интерактивным выбором пользователя, а их визуальные реквизиты не хранят состояние из предыдущих сеансов ручного открытия.
  2. Попытка присвоения всего объекта вместо элемента: Объект СписокЗначений представляет собой коллекцию (множество) элементов. При прямой попытке присвоить список переменной строкового типа (Приемник = СписокЗначений;) платформа не может выполнить автоматическое преобразование коллекции в скалярное значение.
  3. Ошибки в описании типов колонок: Метод НоваяКолонка() ожидает во втором параметре базовый тип (например, "Строка", "Число") или вид объекта конфигурации ("Справочник.Сотрудники"). Конструкция вида "Справочник.МестаХранения.Наименование" является синтаксически неверной.

Способ 1. Использование механизмов сохранения и восстановления значений

Если требуется один раз настроить соответствие реквизитов (например, складов и ответственных лиц), а затем использовать эти данные при фоновой печати документа, оптимальным решением является использование системных функций СохранитьЗначение и ВосстановитьЗначение.

Разберем реализацию по шагам:

  1. В интерактивном режиме формы сохраняем настроенные соответствия в системное хранилище настроек пользователя.
  2. В процедуре формирования печатной формы считываем эти значения без необходимости открывать диалоговое окно.

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


Процедура ПриЗакрытии()
    // Сохраняем значения переменных или списков в системную базу настроек
    СохранитьЗначение("Настройка_МестоХранения_1", МестоХр1);
    СохранитьЗначение("Настройка_Сотрудник_1", сСотр1);
КонецПроцедуры

Теперь рассмотрим, как восстановить сохраненные данные непосредственно в процедуре формирования печатной формы (бухгалтерской справки):


Процедура Печать(Докум)
    Перем ВыбМестоХр1, ВыбСотр1;
    
    // Восстанавливаем сохраненные соответствия
    ВосстановитьЗначение("Настройка_МестоХранения_1", ВыбМестоХр1);
    ВосстановитьЗначение("Настройка_Сотрудник_1", ВыбСотр1);
    
    // Используем полученные значения для сопоставления данных документа
    Если Докум.Склад = ВыбМестоХр1 Тогда
        Ответственный = ВыбСотр1;
    КонецЕсли;
КонецПроцедуры

Способ 2. Корректная работа со СпискомЗначений и ТаблицейЗначений

Если обработка используется в интерактивном режиме с открытой формой, важно правильно извлекать выбранные значения из элементов управления СписокЗначений и заполнять ими ТаблицуЗначений.

Чтобы получить текущий выбранный элемент из списка значений на форме, используем метод ПолучитьЗначение() вместе со свойством ТекущаяСтрока:


// Получаем выбранное значение из СпискаЗначений на активной форме
Если СписокСотрудников.ТекущаяСтрока() > 0 Тогда
    ВыбранныйСотрудник = СписокСотрудников.ПолучитьЗначение(СписокСотрудников.ТекущаяСтрока());
КонецЕсли;

Рассмотрим, как правильно создать и заполнить ТаблицуЗначений полученными данными со ссылочной типизацией или без жесткого ограничения типов:


Функция СформироватьТаблицуСоответствий()
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    
    // Способ 1: Явное указание ссылочного типа
    ТЗ.НоваяКолонка("МестоХранения", "Справочник.МестаХранения");
    ТЗ.НоваяКолонка("Сотрудник", "Справочник.Сотрудники");
    
    // Способ 2: Нетипизированные колонки (принимают любые типы)
    // ТЗ.НоваяКолонка("МестоХранения");
    // ТЗ.НоваяКолонка("Сотрудник");
    
    // Заполняем строку таблицы
    ТЗ.НоваяСтрока();
    ТЗ.МестоХранения = МестоХр1;
    ТЗ.Сотрудник = сСотр1;
    
    Возврат ТЗ;
КонецФункции

Поиск соответствия по сформированной таблице значений выполняется стандартными методами платформы:


НомСтр = 0;
Если ТЗ.НайтиЗначение(ТекущийСклад, НомСтр, "МестоХранения") = 1 Тогда
    ТЗ.ПолучитьСтрокуПоНомеру(НомСтр);
    ОтветственныйСотрудник = ТЗ.Сотрудник;
КонецЕсли;

Способ 3. Сохранение структуры соответствий во внешний файл

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

Для сохранения и загрузки произвольных структур данных (списков или таблиц значений) используем встроенные методы ЗначениеВФайл и ЗначениеИзФайла:


// Сохранение таблицы соответствий в файл
ЗначениеВФайл(КаталогИБ() + "sklad_mol.dat", ТЗ);

// Чтение таблицы соответствий при формировании печатной формы
ТЗ_Загруженная = СоздатьОбъект("ТаблицаЗначений");
ЗначениеИзФайла(КаталогИБ() + "sklad_mol.dat", ТЗ_Загруженная);

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

← На главную