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