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

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

При разработке учетных механизмов нередко возникает задача: предоставить пользователю возможность выбрать в качестве основания либо один документ, либо сразу несколько, чтобы затем выполнить автоматическое заполнение табличных частей. Разберем, почему нельзя просто назначить реквизиту шапки списочный тип и какие варианты реализации существуют в платформе 1С:Предприятие.

Ограничения платформы 1С при работе с реквизитами объекта

В платформе 1С реквизиты объектов метаданных (документов, справочников), сохраняемые в базе данных, могут иметь только примитивные (Число, Строка, Дата, Булево, ХранилищеЗначения) или ссылочные типы. Коллекции значений (такие как СписокЗначений, Массив или ТаблицаЗначений) не могут выступать в качестве типа реквизита объекта.

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

  1. Нарушение ссылочной целостности: платформа не отслеживает ссылки внутри строк или двоичных данных. Документ-основание можно будет пометить на удаление или удалить из базы без предупреждения о наличии зависимостей.
  2. Невозможность использования в запросах: по таким связям нельзя строить прямые соединения в запросах и отчетах.
  3. Отсутствие стандартных связей: механизм поиска ссылок на объект и отчет «Структура подчиненности» не увидят эти документы.

Рассмотрим правильные подходы к реализации в зависимости от бизнес-логики задачи.

Вариант 1. Выбор списка документов только для момента заполнения

Если список выбранных документов нужен исключительно в момент нажатия кнопки «Заполнить» и сохранять связи между документами в базе не требуется, используем элементы управления формы, а не реквизиты объекта.

Разберем по шагам, как это реализовать:

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

СписокДокументов = Новый СписокЗначений;
// Заполняем список доступными для выбора документами
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ПоступлениеТоваровУслуг.Ссылка КАК Ссылка
    |ИЗ
    |	Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
    |ГДЕ
    |	ПоступлениеТоваровУслуг.Проведен = ИСТИНА";

РезультатЗапроса = Запрос.Выполнить().Выгрузить();
СписокДокументов.ЗагрузитьЗначения(РезультатЗапроса.ВыгрузитьКолонку("Ссылка"));

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

Также можно открыть форму журнала или списка документов в режиме множественного выбора. Для этого перед открытием формы списка устанавливается свойство МножественныйВыбор = Истина, а результат обрабатывается в процедуре ОбработкаВыбора.

Вариант 2. Сохранение связей с несколькими документами в базе данных

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

Преимущества данного подхода:

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

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

  1. Табличную часть ДокументыОснования скрываем на отдельную вкладку или делаем невидимой на форме.
  2. В шапку документа помещаем строковое поле ввода (или надпись), куда программно при изменении состава табличной части выводим краткую информацию (например: «Выбрано документов: 3» или перечисление номеров через запятую).
  3. Рядом размещаем кнопку выбора или подбора, которая открывает диалог выбора документов и синхронизирует результат со скрытой табличной частью:

Процедура ОбновитьПредставлениеОснований()
    Если ДокументыОснования.Количество() = 0 Тогда
        ЭлементыФормы.НадписьОснования.Заголовок = "Не выбрано";
    ИначеЕсли ДокументыОснования.Количество() = 1 Тогда
        ЭлементыФормы.НадписьОснования.Заголовок = Строка(ДокументыОснования[0].Документ);
    Иначе
        ЭлементыФормы.НадписьОснования.Заголовок = "Выбрано документов: " + Строка(ДокументыОснования.Количество());
    КонецЕсли;
КонецПроцедуры

Альтернативный вариант: Использование регистра сведений

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

  1. Документ (тип: ссылка на текущий документ);
  2. ДокументОснование (тип: ссылка на документ-основание).

Запись связей в регистр выполняется при проведении или записи документа. Этот вариант сохраняет строгую ссылочную целостность и удобство выборок в запросах, позволяя реализовывать связь «многие ко многим».

← На главную