Наступает день, и Бухгалтер говорит: «Хочу, чтобы при печати акта на списание ОС должность руководителя помещалось в отведенное поле! И чтобы дата подписи акта заполнялась автоматически! И чтобы первоначальная стоимость выводилась даже для тех объектов, которые были списаны при вводе в эксплуатацию! А в графе «Дата выпуска» стояли прочерки».
Что делает начинающий 1С-программист? Он открывает конфигурацию, находит общую таблицу ОС-4, и вносит все изменения, о которых его попросили. Тем самым, приговаривая себя делать это всякий раз, когда выйдет очередное обновление конфигурации.
В отличие от него, опытный 1С-программист знает про внешние печатные формы. Создав такую форму, и привязав её к документу, опытный программист освобождается от необходимости вспоминать о ней при обновлениях конфигурации. Правда, в процессе создания такой формы придется кропотливо переработать исходный код процедуры «Печать» и исходный макет таблицы. Ведь код будет исполняться уже не в контексте формы документа, а в контексте внешнего отчета, а значит ко всем свойствам и методам документа придется обращаться через точку (Документ.ДатаДок вместо ДатаДок). Если же через какое-то время законодатель внесет изменения в унифицированную форму ОС-4, большую часть работы придется проделать заново.
И начинающий, и опытный программист оказываются в затруднительном положении, если Бухгалтер просит дать возможность ввода («и чтоб запоминалось!») в печатную форму информации, хранение которой не предусмотрено стандартной конфигурацией. Например, возможность указания причины списания ОС, или имен членов комиссии по списанию. Многие сдаются, и начинают добавлять дополнительные реквизиты в документы и поля ввода на формы. А потом приходят обновления …
Но не всё безнадежно. Ведь есть общие реквизиты и подчиненные справочники! Идея проста – дополнительную информацию для документов храним в общем реквизите типа строка произвольной длины, дополнительную информацию для элементов справочников – в подчиненных справочниках. Редактирование осуществляем непосредственно из печатных форм, в соответствии с принципом WYSIWYG.
Новые объекты метаданных не препятствуют обновлению конфигурации. Также, корректно обрабатывается удаление документов и элементов справочников – подчиненная им дополнительная информация удаляется вместе с ними. На производительность мы положили уже в первых строках данной статьи – в конце концов, речь идет о печати документов, а не их проведении.
С другой стороны, некоторые дополнительные ухищрения дают нам возможность переносить исходный код и макеты таблиц из конфигурации во внешние формы практически без изменений, связанных со сменой контекста. Для этого нужно просто объявить в модуле отчета переменные с именами, совпадающими с именами реквизитов документа, и определить процедуры и функции, совпадающие с методами документа.
Развитие данных идей привело к созданию шаблона, который уже около года успешно используется для быстрой разработки исправленных и улучшенных версий существующих печатных форм документов и справочников. Шаблон, а также образцы созданных на его основе готовых документов можно скачать по адресу:
//infostart.ru/projects/787/
Рассмотрим процесс создания внешней печатной формы для Акта о списании основных средств, типовой бланк ОС-4(а,б), для конфигурации 1С:Бухгалтерия 4.5.
1. Копируем файл Форма_Болванка.ert в каталог ExtForms\PrnForms информационной базы, и переименовываем его в Форма_ОС-4.ert. Заодно копируем файл Форма_ВводКомиссии.ert – он пригодится позднее.
Создаем там же текстовый файл Форма_ОС-4.efd следующего содержания:
Объект="Документ.СписаниеОС"
Название=Акт ОС-4 внешний
Кнопка=ОС-4 внеш.
Если всё было сделано правильно, в меню выбора печатной формы документа «Списание ОС» должен появиться пункт «Акт ОС-4 внешний», демонстрирующий нам абсолютно пустой бланк.
2. Открываем в конфигураторе файл Форма_ОС-4.ert. Он уже содержим порядка 1000 строк кода, но сейчас мы не будем останавливаться на его детальном разборе. 95% процентов кода составляет базовый функционал, не меняющийся от отчета к отчету. Нас же волнуют только места, обозначенные комментариями [ВСТАВКА] … [КОНЕЦ ВСТАВКИ]. Чтобы наша болванка начала функционировать, требуется заполнение некоторых из отмеченных областей. Первым делом находим область «[ВСТАВКА] Имя отчета» и зададим новое название: «Форма ОС-4». Можно также поменять заголовок формы.
Далее, скопируем содержимое типовой процедуры печати из модуля формы документа «Списание ОС» в область «[ВСТАВКА] Типовая процедура печати». Внесем в скопированный блок следующие изменения: после каждого вызова Таб.ИсходнаяТаблица(<имя макета>) (в тексте их насчитывается 4 шт.) вставим вызов процедуры ИсходнаяТаблица(Таб, <имя макета>). Это необходимо, чтобы печать производилась в таблицу, прикрепленную к нашей форме.
Также (в связи с тем, что в типовой процедуре 1С содержится не совсем корректный код – обращение к реквизитам табличной части вне цикла ВыбратьСтроки / ПолучитьСтроку), перед скопированным блоком вставим вызов:
ВыбратьСтроки(); ПолучитьСтроку();
3. Проверка синтаксиса модуля на данном этапе отобразит нам массу ошибок типа «Переменная не определена». Перейдите в режим 1С:Предприятие, запустите вспомогательную внешнюю обработку ПереченьРеквизитов.ert, выберите в форме документ «Списание ОС» и нажмите кнопку «Сформировать». В окно сообщений будет выведен список реквизитов шапки и табличной части документа.
Блок с реквизитами шапки необходимо скопировать в конфигуратор в область модуля «[ВСТАВКА] Определение и чтение переменных шапки документа». Из блока с реквизитами табличной части строку определения переменных:
Перем НомерСтроки, ОсновноеСредство;
нужно скопировать в область
«[ВСТАВКА] Определение переменных табличной части документа»,
а оставшиеся две строчки –
НомерСтроки = ТекущийОбъект.НомерСтроки;
ОсновноеСредство = ТекущийОбъект.ОсновноеСредство;
в область
«[ВСТАВКА] Чтение переменных табличной части документа».
Если всё сделано правильно, наш отчет при вызове из документа должен вывести печатную форму полностью идентичную стандартной.
4. Добавим в отчет таблицу, назовем её ОС-4, и скопируем в неё содержимое общей таблицы ОС-4. (На самом деле, акт о списании может выводиться в трёх разных типовых формах: ОС-4 – для одиночного списания объектов, кроме автотранспортных средств, ОС-4а – для списания автотранспортных средств, ОС-4б – для группового списания объектов. Здесь мы будем изучать методику на примере первой формы. Модификация двух других форм производится аналогично).
Теперь, когда мы открепили таблицу от конфигурации, можно приступать к её корректировке – исправить формат ячейки «Должность руководителя», настроить заполнение даты утверждения акта, и сделать всё остальное, о чем просил Бухгалтер в начале статьи. Разбирать подробно эти действия смысла нет, единственная рекомендация – отметить все исправленные ячейки, задав для них особый цвет текста. Тогда, если через год унифицированная форма изменится, и потребуется откорректировать макет, то не придется долго вспоминать, что же было исправлено.
5. Небольшая вариация предыдущего пункта: иногда имеет смысл дать возможность Бухгалтеру самому править макет печатной формы (чтобы он не отвлекал пустячными просьбами поправить текстовку или форматирование ячейки, а мог сделать это самостоятельно). Для этого макет таблицы нужно сохранить в тот же каталог, где находится печатная форма (ExtForms\PrnForms\). В нашем случае, можно сохранить таблицу в файл Форма_ОС-4.mxl. Затем в модуле формы, строку ИсходнаяТаблица(Таб, "ОС-4") нужно будет заменить на строку ИсходнаяТаблица(Таб, "ОС-4", "Форма_ОС-4.mxl"). Тогда, в первую очередь программа попробует подключить внешний файл таблицы, и только если он не найден, будет использовать встроенный макет.
Если всё сделано правильно, в форме станет доступной кнопка «Изменить макет».
6. Теперь вспоминаем, что Бухгалтер хочет иметь возможность указывать состав комиссии по списанию, заключение комиссии, и причину списания основных средств. Начнем с комиссии. Откроем макет таблицы и для соответствующей ячейки установим тип: Выражение, текст:
ДопИнфо("Председатель комиссии") – для председателя,
ДопИнфо("Член комиссии 1") – для первого члена комиссии,
ДопИнфо("Член комиссии 2") – для второго члена комиссии и т.д.
В поле расшифровка этих ячеек укажем:
РасшДопИнфо("Председатель комиссии") – для председателя,
РасшДопИнфо("Член комиссии 1") – для первого члена комиссии,
РасшДопИнфо("Член комиссии 2") – для второго члена комиссии и т.д.
Для ячеек, соответствующих должностям членов комиссии укажем текст:
ДопИнфо("Председатель комиссии (должность)")
ДопИнфо("Член комиссии 1 (должность)")
ДопИнфо("Член комиссии 2 (должность)") ...
В поле расшифровка этих ячеек укажем:
РасшДопИнфо("Председатель комиссии (должность)")
РасшДопИнфо("Член комиссии 1 (должность)")
РасшДопИнфо("Член комиссии 2 (должность)") ...
Окрасим фон ячеек в светло-желтый цвет – он знаком Бухгалтеру по регламентированным отчетам.
Если всё сделано правильно, то при двойном щелчке в отчете по любой из настроенных ячеек, будет предложено ввести значение поля. После ввода, значение будет отображено в ячейке.
Также, если названия полей для комиссии были указаны в точности, как написано выше, появится возможность быстрого заполнения имен и должностей с помощью кнопки «Выбрать комиссию».
Аналогичным образом настраиваем ячейку для заключения комиссии.
Что касается причины списания, сделаем так, чтобы соответствующая информация сохранялась в привязке не к документу, а непосредственно к объекту основных средств. Кроме того, нужно, чтобы, если причина списания не задана, выводился текст по умолчанию – «Непригодно к эксплуатации». Поэтому для соответствующей ячейки таблицы используем расширенный синтаксис. В поле текст укажем:
ДопИнфо("Причина выбытия", ОсновноеСредство, "Непригодно к эксплуатации")
В поле расшифровка этих ячеек укажем:
РасшДопИнфо("Причина выбытия", ОсновноеСредство, "Непригодно к эксплуатации")
7. Теперь вернемся к членам комиссии. На этот раз Бухгалтер хочет не просто вводить имена, но и выбирать их из справочника «Сотрудники». Для этого немного исправим расшифровку ячеек: вместо
РасшДопИнфо("Председатель комиссии")
укажем
РасшДопИнфо("Председатель комиссии",,,"Справочник.Сотрудники").
Аналогичные изменения внесем в расшифровку ячеек для других членов комиссии.
Если всё сделано правильно, то при двойном щелчке в отчете по соответствующему полю, программа предложит выбрать значение из справочника, либо отредактировать вручную.
Но Бухгалтер не унимается и требует, чтобы при выборе члена комиссии из справочника автоматически подставлялась его должность. Чтобы это сделать, вернемся в конфигуратор, найдем в модуле место, помеченное комментарием
«[ВСТАВКА] Дополнительная обработка связанных полей»,
и добавим следующий код:
Если (Ид = "Председатель комиссии") и (Действие = "< выбрать >") Тогда
УстановитьДопИнфо(Объект.Должность, "Председатель комиссии (должность)")
КонецЕсли;
Аналогичный код добавим и для других членов комиссии.
8. К сожалению, как вы наверняка уже заметили, вся информация, которую мы вбиваем в созданные нами поля, теряется при закрытии печатной формы. Чудес не бывает – в стандартной конфигурации её просто негде сохранить. Поэтому снова зайдем в конфигуратор, откроем конфигурацию, и создадим общий реквизит документов типа «строка неограниченной длины», назвав его «ДополнительнаяИнформацияДокумента». Также нам потребуются два новых справочника «ОсновныеСредстваДопХарактеристики» и «КонтрагентыДопХарактеристики», подчиненные справочникам «ОсновныеСредства» и «Контрагенты» соответственно. Их можно взять из демо-конфигурации по приведенной выше ссылке. Аналогичные справочники можно создать для любых других справочников конфигурации, составив их название из имени базового справочника + суффикс «ДопХарактеристики».
Если всё сделано правильно, то информация, введенная в печатной форме, будет сохраняться в базе данных. Следует иметь ввиду один нюанс: если печатная форма вызвана из формы документа, то все изменения дополнительной информации, выполняемые в печатной форме, будут записываться в открытый документ. При закрытии формы документа программа задаст вопрос, следует ли сохранить сделанные изменения в базу данных, или закрыть документ без сохранения.
Наша тестовая внешняя форма готова. Аналогичным образом «лепятся» печатные формы и для других документов. Среди образцов, доступных по приведенной выше ссылке, можно найти демонстрацию и других возможностей, не рассмотренных в данной статье:
* использование одной печатной формы для нескольких документов (Акт ОС-1 – применяется для документа ВводВЭксплуатациюОС и документа ПередачаОС)
* выбор значения поля из списка (Акт ОС-4 – выбор причины списания ОС и заключения комиссии)
* двухсторонние и многостраничные формы (Акт ОС-15)
* печатная форма для справочника (Карточка ОС-6)
Автор извиняется за многословие у всех, кто добрался до этой строчки, и надеется, что польза от статьи хоть немного скомпенсирует читателю потерянное время.