При работе в конфигурации 1С:Бухгалтерия предприятия 3.0 (БП 3.0) как пользователи, так и разработчики часто сталкиваются с необходимостью детального анализа движений документов. При нажатии на стандартную кнопку Дт/Кт (Показать проводки и другие движения документа) открывается форма, отображающая закладки со всеми регистрами, по которым документ сделал записи.
Однако стандартный вид этой формы не всегда удобен. Например, кнопка Перейти в список или другие важные команды могут быть спрятаны глубоко в выпадающем меню Ещё, что замедляет работу. Кроме того, часто возникает вопрос: почему на этой форме пропадают привычные колонки, такие как Регистратор или Активность, и как вернуть их отображение? В этой статье мы подробно разберем внутреннее устройство формы движений, выясним причины такого поведения платформы и научимся правильно кастомизировать интерфейс с помощью механизмов расширений.
Если попытаться найти форму движений в конфигураторе напрямую через метаданные конкретного регистра сведений или регистра накопления, то мы потерпим неудачу. У регистров есть стандартные формы списка и формы записи, но ни одна из них не соответствует тому окну, которое мы видим при нажатии на Дт/Кт.
Выясним причину. На самом деле для отображения движений используется основная форма встроенной обработки КорректировкаДвижений. Особенность этой обработки заключается в том, что в конфигураторе ее форма выглядит практически пустой. На ней нет заранее созданных вкладок под сотни существующих в системе регистров.
Рассмотрим, как устроен этот механизм. Все элементы интерфейса собираются динамически на лету (на сервере) в момент открытия формы:
ИзменитьРеквизиты() для каждого подходящего регистра динамически создается реквизит формы с типом набора записей (например, РегистрНакопленияНаборЗаписей или РегистрСведенийНаборЗаписей).Именно из-за динамического создания таблиц стандартные настройки формы через визуальный редактор конфигуратора напрямую невозможны.
Когда платформа динамически генерирует командную панель для новой таблицы набора записей, она стремится максимально сэкономить экранное пространство. По этой причине большинство стандартных команд (включая переход к списку записей регистра) автоматически помещается в выпадающее подменю Ещё (или Все действия).
Для того чтобы вынести нужную кнопку (например, «Перейти в список») непосредственно на саму командную панель таблицы, сделав ее видимой без лишних кликов, необходимо использовать свойство элемента управления ТолькоВоВсехДействиях.
Проанализируем программное свойство кнопки. Установив значение этого свойства в Ложь, мы указываем платформе, что кнопка должна дублироваться на основной панели:
НоваяКнопка.ТолькоВоВсехДействиях = Ложь;
Если мы выполняем доработку формы программно, нам необходимо обойти коллекцию подчиненных элементов созданной командной панели, найти нужную кнопку по имени или связанной команде и принудительно переключить данное свойство.
В коде обработки КорректировкаДвижений можно встретить строки, которые на первый взгляд кажутся странными и вызывают подозрения в конфликтах прав доступа или RLS:
РеквизитыНабораЗаписей.Колонки.Удалить("Регистратор");
РеквизитыНабораЗаписей.Колонки.Удалить("Активность");
Разберем по шагам, зачем разработчики фирмы "1С" явно удаляют эти колонки из структуры данных отображаемой таблицы.
1. Исключение дублирования данных (колонка «Регистратор»)
Форма корректировки движений всегда открывается в контексте **одного конкретного документа**. Это означает, что во всех строках абсолютно всех таблиц на всех вкладках значение в поле Регистратор будет строго одинаковым — это ссылка на сам открытый документ. Вывод этой колонки на экран не несет никакой полезной информации для пользователя, но при этом загромождает интерфейс и заставляет использовать горизонтальную прокрутку. Поэтому колонка удаляется в целях эргономики.
2. Обеспечение логической целостности (колонка «Активность»)
Поле Активность отвечает за то, участвуют ли записи набора в расчете итогов регистров. На уровне платформы 1С для большинства регистров (особенно для регистра бухгалтерии) действует жесткое правило: **активность всех записей в рамках одного регистратора должна быть одинаковой**. Нельзя сделать так, чтобы первая проводка документа была активной, а вторая — неактивной. Попытка записать такой разнородный набор приведет к транзакционной ошибке базы данных. Чтобы уберечь пользователя от некорректного изменения активности отдельных строк, вывод этой колонки блокируется. Управление активностью движений выполняется глобально для всего документа сразу.
Изменение типового кода обработки КорректировкаДвижений напрямую в основной конфигурации крайне нежелательно, так как это усложнит процедуру последующих обновлений системы. Правильным и современным подходом является использование **расширений конфигурации**.
Рассмотрим пошаговый алгоритм решения этой задачи:
КорректировкаДвижений и ее основную форму.ПриСозданииНаСервере с аннотацией &После.Напишем программный код, который найдет все динамически созданные таблицы регистров, обнаружит кнопки перехода к спискам и вынесет их на командную панель:
&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Обходим все элементы формы в поисках динамически созданных таблиц
Для Каждого ЭлементФормы Из Элементы Цикл
// Проверяем, является ли элемент таблицей движений регистра
Если ТипЗнч(ЭлементФормы) = Тип("ТаблицаФормы") Тогда
// Нам нужна командная панель, привязанная к этой таблице
ИмяПанели = ЭлементФормы.Имя + "_КоманднаяПанель";
КоманднаяПанель = Элементы.Найти(ИмяПанели);
Если КоманднаяПанель <> Неопределено Тогда
// Обходим элементы командной панели в поисках кнопки перехода к списку
Для Каждого Кнопка Из КоманднаяПанель.ПодчиненныеЭлементы Цикл
// Идентифицируем кнопку по имени стандартной команды перехода
Если Найти(Кнопка.Имя, "ОткрытьСписок") > 0
Или Найти(Кнопка.Имя, "ПерейтиВСписок") > 0 Тогда
// Заставляем платформу показать кнопку прямо на панели
Кнопка.ТолькоВоВсехДействиях = Ложь;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот код является универсальным. Он автоматически сработает для любой вкладки любого регистра (бухгалтерии, накопления или сведений), динамически добавленного на форму движений текущего документа. При этом типовая конфигурация останется на полной поддержке, а пользователи получат удобный и быстрый доступ к необходимым функциям в один клик.