Как объединить три связанных документа в один интерфейс в 1С:Управление торговлей 10.3?

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

В практике разработки на платформе 1С:Предприятие 8 (особенно в конфигурациях на обычных формах, таких как Управление торговлей редакции 10.3) часто возникает задача оптимизации пользовательского интерфейса. Типичный сценарий: бизнес-процесс компании состоит из нескольких последовательных шагов, под каждый из которых создан свой документ. Например, «Принятие товаров» (приемка в ремонт) → «Починка» (выполнение ремонтных работ) → «Выписка» (возврат клиенту и оплата).

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

Почему при тестировании не видны добавленные вкладки на панели формы?

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

  1. Программное управление видимостью в общем коде. В типовой конфигурации УТ 10.3 формы документов сильно завязаны на общие модули управления интерфейсом. При открытии формы в процедурах ПередОткрытием или ПриОткрытии могут вызываться функции, настраивающие видимость закладок в зависимости от прав пользователя, вида операции или договора. Код конфигурации может принудительно устанавливать свойство панели ОтображениеЗакладок в значение ОтображениеЗакладок.НеИспользовать.
  2. Автоматическое скрытие пустых страниц. Платформа 1С:Предприятие в режиме обычных форм оптимизирует отрисовку интерфейса. Если на новой добавленной странице панели нет ни одного видимого элемента управления (кнопки, поля ввода, табличной части) или если у всех элементов на этой странице свойство Видимость программно установлено в значение Ложь, сама вкладка этой страницы автоматически скрывается с экрана.
  3. Права доступа и роли. Если новые вкладки привязаны к реквизитам или табличным частям новых объектов метаданных, к которым у текущего пользователя (даже при тестировании под полными правами в некоторых случаях ограничений RLS) нет доступа, платформа скроет эти элементы вместе с содержащей их страницей.

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


// В процедуре ПриОткрытии формы принудительно включаем отображение закладок
ЭлементыФормы.ОсновнаяПанель.ОтображениеЗакладок = ОтображениеЗакладок.Сверху;
ЭлементыФормы.ОсновнаяПанель.ТекущаяСтраница = ЭлементыФормы.ОсновнаяПанель.Страницы.СтраницаПринятие;

---

Нужно ли переносить макеты, регистры и формы в один документ?

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

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

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

Формы и интерфейс. Простое копирование элементов с трех форм на одну создаст «кашу» из реквизитов. У формы документа может быть только один основной реквизит ДокументОбъект. Это значит, что при попытке редактировать данные трех разных сущностей на одной форме возникнет конфликт записи данных.

---

Лучшее архитектурное решение №1: Единый документ со статусной моделью

Вместо того чтобы связывать три разных документа в один интерфейс, правильнее спроектировать один документ, жизненный цикл которого разделен на статусы. Такой подход используется в современных решениях фирмы 1С (например, в 1С:УНФ в документе «Заказ-наряд»).

Создадим или модифицируем один документ (например, «Ремонтная карта»), добавив в него реквизит Статус (тип: ПеречислениеСсылка.СтатусыРемонта со значениями: Принят, ВРаботе, Выполнен, Выдан).

Рассмотрим, как меняется поведение формы и проведения в зависимости от статуса:

Пример реализации выборочного проведения в модуле объекта единого документа:


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

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

---

Альтернативное решение №2 (Безопасное): Создание АРМ (Рабочего места)

Если ваша конфигурация 1С:УТ 10.3 находится на поддержке и вы не хотите вносить масштабные изменения в структуру метаданных (чтобы не усложнять последующие обновления), физическое объединение документов противопоказано. В этом случае лучшим выбором будет создание АРМ (Автоматизированного рабочего места) в виде внешней или встроенной обработки.

АРМ позволяет пользователю работать в режиме одного окна с тремя физически разными документами, которые связаны между собой по ссылкам (через реквизит ДокументОснование).

Разберем по шагам логику работы АРМ:

  1. На форме обработки создается панель с тремя вкладками: «Приемка», «Ремонт», «Выдача».
  2. Пользователь выбирает или создает документ «Принятие товаров». Обработка программно ищет в базе данных связанные с ним документы «Починка» и «Выписка», используя запросы по ссылкам подчиненности.
  3. Данные всех трех документов загружаются в реквизиты обработки и отображаются на соответствующих вкладках. Пользователь может свободно редактировать информацию во всех вкладках одновременно.
  4. При нажатии кнопки «Сохранить» обработка должна выполнить транзакционную запись всех измененных документов. Это критически важно для сохранения целостности базы данных.

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


Процедура ЗаписатьВсеДокументыНаФорме()
    
    НачатьТранзакцию();
    
    Попытка
        // 1. Записываем и проводим документ Приемки
        ДокПриемкаОбъект = РеквизитДокПриемка.ПолучитьОбъект();
        ДокПриемкаОбъект.Записать(РежимЗаписиДокумента.Проведение);
        
        // 2. Связываем документ Починки с Приемкой и записываем
        ДокПочинкаОбъект = РеквизитДокПочинка.ПолучитьОбъект();
        ДокПочинкаОбъект.ДокументОснование = ДокПриемкаОбъект.Ссылка;
        ДокПочинкаОбъект.Записать(РежимЗаписиДокумента.Проведение);
        
        // 3. Связываем документ Выписки с Починкой и записываем
        ДокВыпискаОбъект = РеквизитДокВыписка.ПолучитьОбъект();
        ДокВыпискаОбъект.ДокументОснование = ДокПочинкаОбъект.Ссылка;
        ДокВыпискаОбъект.Записать(РежимЗаписиДокумента.Проведение);
        
        // Если все документы записались без ошибок, фиксируем транзакцию
        ЗафиксироватьТранзакцию();
        Сообщить("Данные успешно сохранены во всех трех документах!");
        
    Исключение
        // Если возникла ошибка (например, не хватило товара на складе для починки),
        // откатываем все изменения, чтобы не возникло рассинхронизации данных
        ОтменитьТранзакцию();
        Предупреждение("Ошибка при сохранении документов: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

---

Какое решение выбрать в итоге?

Выбор архитектурного решения зависит от требований к ведению учета и текущего состояния вашей базы 1С:

← На главную