Продвинутая технология внешних печатных форм

18.02.07

Разработка - Математика и алгоритмы

Технология позволяет создавать внешние печатные формы на основе существующих встроенных с минимальными изменениями кода и макета таблицы. Ввод в печатные формы и запоминание в базе любой дополнительной информации без проблем с обновлением конфигурации.
(Необходимое предисловие: описанные в статье механизмы не подходят для информационных баз, в которых производительность является узким местом. Если вас беспокоит такая вещь, как блокировки, не тратьте время на эту статью. Данная технология – удел небольших компаний и приходящих программистов)


Наступает день, и Бухгалтер говорит: «Хочу, чтобы при печати акта на списание ОС должность руководителя помещалось в отведенное поле! И чтобы дата подписи акта заполнялась автоматически! И чтобы первоначальная стоимость выводилась даже для тех объектов, которые были списаны при вводе в эксплуатацию! А в графе «Дата выпуска» стояли прочерки».

Что делает начинающий 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)

Автор извиняется за многословие у всех, кто добрался до этой строчки, и надеется, что польза от статьи хоть немного скомпенсирует читателю потерянное время.

См. также

Загрузка и выгрузка в Excel Математика и алгоритмы Программист Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

Статья посвящена распространённому вопросу - как сохранить несколько таблиц (отчетов) в формате MXL, с которым работает 1С, на отдельные листы одного Excel файла. Освещается простой алгоритм решения проблемы штатными средствами, без использования внешних модулей и библиотек (не относящихся к 1С и Excel).

23.11.2015    19316    etmarket    14    

21

Разработка внешних компонент Математика и алгоритмы Программист Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия, а так же генерация модулей на C# и 1С для подключения к событиям. Использование DynamicMethod и ILGenerator. Представлены примеры для использовании событий System.IO.FileSystemWatcher (Ожидает уведомления файловой системы об изменениях и инициирует события при изменениях каталога или файла в каталоге.) и SerialPort (обработка сканера штрих кода подключенного к COM порту). Обертка позволяет использовать классы .Net только на языке 1С. Реализация 1C Messenger описанного здесь http://infostart.ru/public/434771/

12.11.2015    51933    Serginio    36    

58

Математика и алгоритмы Программист Платформа 1С v7.7 Платформа 1С v8.3 Абонемент ($m)

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

1 стартмани

25.02.2015    25209    etmarket    46    

18

Математика и алгоритмы Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Часто при приеме на работу встречается задача про сгибание листка

1 стартмани

26.02.2013    19823    11    Sbelyi78    38    

9

Математика и алгоритмы Системный администратор Программист Бухгалтер Оперативный учет 7.7 Бухгалтерский учет 7.7 Расчет 7.7 Конфигурации 1cv7 Россия Абонемент ($m)

Универсальная печать таблицы значений, которую не стыдно прикрутить к рабочей базе данных. Группировка данных, подсчет итогов, составление диаграмм, выгрузка в быстрый доступ к исходной ТЗ.

1 стартмани

23.05.2012    14909    66    McSeem    3    

8

Математика и алгоритмы Программист Платформа 1С v7.7 Конфигурации 1cv7 Россия Абонемент ($m)

Алгоритм получения значения тригонометрических функций путем разложения их в ряд Тейлора

1 стартмани

04.03.2012    8796    4    nysysimara    10    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. CheBurator 2712 19.02.07 14:26 Сейчас в теме
5 баллов. +1
> Также нам потребуются два новых cправочника «ОсновныеСредстваДопХарактеристики» и «КонтрагентыДопХарактеристики», подчиненные справочникам «ОсновныеСредства» и «Контрагенты» соответственно. ... Аналогичные справочники можно создать для любых других справочников конфигурации, составив их название из имени базового справочника + суффикс «ДопХарактеристики».
..
А вот предложение: извернуться всего одним справочником ДопХарактеритсики, в котором указывать допхарактеристики и (вид)справочник-хозяин...?
было бы еще универсальнее...
2. clappa 902 19.02.07 16:25 Сейчас в теме
К сожалению, в этом случае не работает автоматическая пометка на удаление характеристик при пометке на удаление базового элемента.
И ещё один нюанс. Чтобы не корежить формы, я приучил бухгалтеров переходить из списка ОС к доп. характеристикам через стандартную кнопочку "Открыть подчиненный справочник". Жаль терять эту фишку.
3. andrey995 20.02.07 09:59 Сейчас в теме
для clappa
если много подчиненных справочников то что если повесить в интерфейс общую кнопочку "Доп Характеристики" кот открывает обработку открывающую общий справочник по активному контексту фильтруя сразу по нужному элементу - а для автоудаления - поставить в форму нашего справочника парсер удаленных владельцев
4. clappa 902 20.02.07 18:07 Сейчас в теме
(andrey995) Я думаю, теоретически это возможно. Но я не умею получать активный контекст. Тут, наверное, без внешней компоненты не обойтись. Кроме того, как сделать так, чтобы доп. характеристики не мешали физическому удалению владельца? Видимо, ссылку на владельца придется хранить не в обычном виде, а как строку. Короче, есть над чем поломать голову.
5. progr 20.11.07 05:01 Сейчас в теме
от начинающей - большое спасибо автору. Всё так подробненько и просто, хотя сама только только пробую.
6. Kruzo 27.02.09 01:19 Сейчас в теме
ОС-15 ругается:
"Невозможно сохранение дополнительной информации для документа.
Введенная информация будет потеряна после закрытия формы!"
Как исправить?
7. Kruzo 01.03.09 20:34 Сейчас в теме
(6) Разобрался. Создал общий реквизит документов ДополнительнаяИнформацияДокумента - ОС-15 ругаться перестал.
8. v_id 106 26.06.09 10:18 Сейчас в теме
Не устаю поражаться мастерству автора. Спасибо большое!
Жаль только давно ничего нового не пишет :)
9. erthia 03.12.11 10:07 Сейчас в теме
Огромное спасибо! Очень ценная в практическом плане технология, и в то же время гибкая.
У меня вопрос: как заставить записать информацию, введенную в печатной форме ОС-6, если реквизит Основного средства есть в конфигурации (например ОКОФ в справочнике ОсновныеСредства с типом строка), то есть не требуется ДопИнфо?

Сделал по подобию других доп.значений, ругается
"Невозможно сохранение дополнительной информации для документа. Введенная информация будет потеряна после закрытия формы!"
В конфигурацию справочники «ОсновныеСредстваДопХарактеристики» не добавлялись.
Оставьте свое сообщение