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