Как изменить печатную форму через расширение

К сожалению, типовой функционал программ 1С не всегда удовлетворяет все запросы бухгалтера или директора. И тут на помощь приходят программисты, которые дописывают обработки, отчеты, расширения под желания своих заказчиков. А вы хоть раз задумывались, что общего у бухгалтера и программиста? Ведь на первых шагах своего
Создано 03.10.2022 09:37
Опубликовано 03.10.2022 09:37
Автор: Administrator
Просмотров: 1029

К сожалению, типовой функционал программ 1С не всегда удовлетворяет все запросы бухгалтера или директора. И тут на помощь приходят программисты, которые дописывают обработки, отчеты, расширения под желания своих заказчиков. А вы хоть раз задумывались, что общего у бухгалтера и программиста? Ведь на первых шагах своего взаимодействия они общаются одинаково… Первый со вторым, а второй с компьютером, так как будто последний ничего не знает и все указания воспринимает буквально. В этой публикации мы рассмотрим популярные изменения конфигурации: печатные формы (отчеты), расширения и другие изменения конфигурации, а также дадим рекомендации как не напороться на рифы необновляемой конфигурации. 

Как говорил известный ученый и специалист по компьютерам Эдсгер Дейкстра «Если отладка – процесс удаления ошибок, то программирование должно быть процессом их внесения».

Для примера взаимодействия и упрощения терминов языка программирования представим, что пишем программу, указывающую компьютеру как приготовить бутерброд:

Программист: «Возьми хлеб!»

Компьютер: «Ошибка отладчика: «Я не понимаю, что такое возьми и хлеб».

Программист: «Протяни руку туда, куда я скажу и схвати то, что там будет!»

Компьютер: «Ошибка отладчика: «Я не понимаю, что такое рука!»

Программист (вздыхая): «Вот это штука (указывая на руку)».

Компьютер: «Понял».

Программист: «Протяни руку туда, куда я скажу и схвати хлеб!»

Компьютер: «Ошибка отладчика: «Я не понимаю, что такое схвати!»

Программист: «Протяни руку туда, куда я скажу и согни 5 пальцев вот так (показывает)»

Компьютер: Протягивает руку к хлебу, сжимает пальцы и разжимает (Хлеб остается на месте) …

«Дурацкий пример!» — скажете вы, но именно так или почти так строится первое взаимодействие: Компьютер (язык программирования) не может понять то, что программист в точности не определил, а любой процесс, который он пытается описать нуждается в полном и однозначном определении! Аналогично и при общении с бухгалтером это взаимодействие похоже на известную игру «Испорченный телефон».

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

Привыкнув к тому факту, что компьютер (программист) не способен читать ваши мысли, вы постепенно учитесь давать инструкции, которые программист (компьютер) сможет понять (выполнить).

Как автор статьи хочу немного добавить от себя: помню, как учился в ВУЗе писать программы на языке C++ и как расстраивался, когда много часов искал пропущенную точку с запятой, из-за которой не работала моя программа и вдобавок омрачали слова преподавателя: «Вы никогда не будете использовать пузырьковую сортировку в реальных программах, но мы все равно будем ее изучать согласно программы ВУЗа!».

Из вышеописанного примера появляется более понятное определение программирования (в отличие от описанного в учебниках) или постановки задачи: «определить начальную информацию (входную), установить последовательность шагов, точно описывающих действия компьютера с входными данными (алгоритм), и определить выходные данные (результат)».

Основной риф необновляемой конфигурации при доработках заключается в том, что затраты на обновление (трудовые и финансовые) становятся больше, чем польза от такого обновления, и зачастую решаются ручным вводом/заполнением/исправлением данных.

Все рифы необновляемой конфигурации легко обойти по карте, которая вырисовывается из вышеописанного определения программирования:

1. Дать верную (полную) входную информацию;

2. Дать верную (точную) последовательности шагов (алгоритм);

3. Обозначить верные (конкретные) выходные результаты.

Пройдемся подробнее по каждому пункту:

Верная входная информация для печатных форм заключается в:

• Определении источника для печати – документа и его конкретной формы или нескольких форм. Печатные формы (далее ПФ) в 1С привязаны к документу(ам), данные которого они выводят на экран в виде шаблона(таблицы) печатной формы из кнопки печать.

• Определении макета(ов) (шаблон или пример) печатной формы, с указанием полей, которые должны подставляться из 1С.
Верная последовательность шагов (алгоритма) для печатных форм заключается в:

• Определении вариантов подстановки полей, которые должны подставляться из 1С – какое поле брать для справочника (наименование или полное наименование), в каком падеже склонения выводить на макет.

• Определении неизменяемой части текста макета (шаблона или примера) печатной формы, в зависимости от операции документа или изменения других его реквизитов.
Верные выходные результаты для печатных форм заключается в:

• Определении размеров и параметров печати на принтере – умещать на одну страницу или переносить, сохраняя часть текста в заголовке, необходимость сохранять и конвертировать в другие форматы файлов Excel, Word и др.

• Видимость, доступность для разных пользователей в зависимости от их прав доступа.

Согласно принципу Парето, только 20% доработок имеют обоснование, а 80% делаются по незнанию типового функционала Заказчиком, или Исполнителем.

Далее рассматриваем эти 80% процентов:

1. Многие печатные формы типовых 1С доступны для редактирования пользователям и такие простейшие задачи как изменить шапку приказа (ссылку на унифицированную формы, шрифт, и другие элементы) решаются как в привычных офисных документах WORD(*.doc) и Excel (*.xls).

Редактирование макетов печатных форм (табеля, счета и акта) мы ранее уже рассматривали в статьях. Макеты открываются из раздела «Администрирование» и позволяют добавить/удалить/заменить данные в макете, добавить вычисляемое или логическое выражение, а также восстановить стандартные настройки макета, если изменения стали не актуальны.

2. В 1С: ЗУП КОРП ред. 3.1 часто возникает необходимость кадровикам создать какой-то отдельный приказ (награждение конкурса, организация спортивных и других мероприятий), которого нет в программе и при этом учитывать его и контролировать отсутствие дублей номеров, а также хранить копии шаблонов таких приказов для повторного использования. Тогда можно использовать механизм «Произвольные кадровые приказы» доступный из раздела настройка: 

Каждый шаблон разрабатывает сам пользователь без привлечения программиста или наличия умения программировать:

♦ Перечисляя подставляемые поля приказа:

♦ Указывая как оформляется приказ: на каждого сотрудника или один на несколько сотрудников:

♦ Добавляя или разрабатывая с программистом внешнюю печатную форму, чтобы можно было распечатать и подписать или опубликовать приказ:

♦ Указывая подписантов:

♦ И используя этот шаблон для приказа, в котором подписанты заполняются актуальные на эту дату. И по кнопке «Создать на основании» можем создать документ «Премия», в котором указанные сотрудники будут заполнены автоматически:

Таким образом можно настроить аналогичные другие приказы, например, об организации мероприятий:

3. Настроить разные полномочия подписантов.

1С: ЗУП КОРП позволяет отразить:

– для разных документов – разные подписи,

– добавить для одного сотрудника разные доверенности с разными сроками действия,

– сменить подписанта.

Ответственные лица доступны из справочника организации на закладке «Учетная политика и другие настройки»:

Здесь же можно посмотреть основания полномочий ответственных лиц и показать неактуальные доверенности.

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

При наличии у подписанта нескольких доверенностей или же необходимости сменить доверенность, пользователь в самом документе выбирает основание и из списка требуемую доверенность:

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

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

Изменения основной конфигурации происходит под бизнес-требования пользователей программы и влекут за собой затраты на приведение в рабочее состояние изменений при каждом типовом обновлении программы.

Расширения конфигурации больше похожи на внешние отчеты или обработки, которые позволяют изменять типовую конфигурацию и хранить эти изменения не в самой конфигурации, а во внешних объектах (расширениях), тем самым позволяя обновляться на все типовые обновления программы. Однако это так же может требовать затрат на приведение в рабочее состояние изменений в расширениях после каждого нового обновления.

Расширения успешно работают с 2014 года и с каждым годом их функциональность становится богаче.

Чаще всего расширения используют:

• Для сохранения типового функционала и беспрепятственного обновления;

• Для раздельных настроек для каждого из филиалов, при режиме разделения данных;

• Для внедрений, когда доработки делаются под себя собственными ИТ-специалистами или специалистами Подрядчика;

Расширения не используют:

♦ Когда требуется добавить новые объекты конфигурации или изменять их тип данных;

♦ В старых конфигурациях, в которых механизм использовать невозможно;

На сайте 1С есть страница посвященная расширениям, там есть раздел «Назначение» и «Сценарии использования», можно ознакомиться с ними еще более подробнее.

Подведем итоги:

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

1) Что грозит мне?

2) И что грозит им?

И если первая угроза больше, то спасатель ждет подмогу, чтобы не стать самому пострадавшим, ожидающим помощи.

Поэтому давайте разберем алгоритм доработок по возрастанию затрат и рисков:

1. Знать типовой функционал или обратиться к тому, кто знает, например, в наш закрытый клуб бухгалтеров, в котором мы отвечаем, как на вопросы учета, так и на вопросы владения программой, рассказываем о типовых возможностях программ и в самом крайнем случае рекомендуем обращаться за доработками.

2. Дорабатывать внешними объектами (отчеты, обработки, расширения).

3. Изменять основную конфигурацию следуя системе стандартов и методик разработки конфигурации от фирмы 1С.

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

Автор статьи: Сергей Барбатько

Понравилась статья? Подпишитесь на рассылку новых материалов

Добавить комментарий

polax

То что вы описали я это уже сделал,кроме пункта 3(на этом у меня и ступор):

Цитата
Сообщение от polax
Посмотреть сообщение

Примерно так:
1. Заимствовать док ПТУ
2. В модуле менеджера в После Процедура ДобавитьКомандыПечати добавить нужную команду
3. Там же в Перед Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Сделать вывод своего макета через созданную в расширении процедуры и функции по типу как в трог12 но адаптированную под ваш макет

У меня проблема с выводом, так как например в ТОРГ12 используется запрос и очень сложно получается массивобъектов и прочее, которые потому служат для вывода в процедуре Печать. То есть я пытался по аналогии сделать,но ужасно сложно и одни ошибки вылазят.

А мой макет уже реализован в самописной конфигурации в модуле формы документа. И там всё намного проще:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
&НаКлиенте
Функция ВернутьСтруктуруПараметровПечатнойФормы(ИмяМакета) Экспорт
    СтруктуруПараметровПечатнойФормы    = Неопределено;
    
    Если ИмяМакета = "М_7" Тогда
        СтруктуруПараметровПечатнойФормы    = Новый Структура;
        СтруктуруПараметровПечатнойФормы.Вставить("Макет",                                                 "");
        СтруктуруПараметровПечатнойФормы.Вставить("Номер",                                                 "");
        СтруктуруПараметровПечатнойФормы.Вставить("Организация",                                     "");
        СтруктуруПараметровПечатнойФормы.Вставить("КодОКПО",                                         "");
        СтруктуруПараметровПечатнойФормы.Вставить("РуководительДолжность",                                 "");
        СтруктуруПараметровПечатнойФормы.Вставить("Руководитель",                                       "");
        СтруктуруПараметровПечатнойФормы.Вставить("ДатаСоставленияДень",                                 "");
        СтруктуруПараметровПечатнойФормы.Вставить("ДатаСоставленияМесяц",                               "");
        СтруктуруПараметровПечатнойФормы.Вставить("ДатаСоставленияГод",                               "");
        СтруктуруПараметровПечатнойФормы.Вставить("Дата",                                               "");
        СтруктуруПараметровПечатнойФормы.Вставить("Склад",                                                 "");
        СтруктуруПараметровПечатнойФормы.Вставить("ВремяНачалоПриемкиЧас",                                 "");
        СтруктуруПараметровПечатнойФормы.Вставить("ВремяНачалоПриемкиМинута",                           "");
        СтруктуруПараметровПечатнойФормы.Вставить("ВремяОкончанияПриемкиЧас",                           "");
        СтруктуруПараметровПечатнойФормы.Вставить("ВремяОкончанияПриемкиМинута",                         "");
        СтруктуруПараметровПечатнойФормы.Вставить("СопроводительныйДокумент",                           "");
        СтруктуруПараметровПечатнойФормы.Вставить("УдостоверениеОКачествеНомер",                     "");
        СтруктуруПараметровПечатнойФормы.Вставить("Станция",                                             "");
        СтруктуруПараметровПечатнойФормы.Вставить("ТранспортныйДокументНомер",                             "");
        СтруктуруПараметровПечатнойФормы.Вставить("ТранспортныйДокументДата",                           "");
        СтруктуруПараметровПечатнойФормы.Вставить("ТранспортныйДокументВагоны",                       "");
        СтруктуруПараметровПечатнойФормы.Вставить("Отправитель",                                         "");
        СтруктуруПараметровПечатнойФормы.Вставить("Поставщик",                                             "Он же");
        СтруктуруПараметровПечатнойФормы.Вставить("Получатель",                                       "");
        СтруктуруПараметровПечатнойФормы.Вставить("СтраховаяКомпания",                                     "");
        СтруктуруПараметровПечатнойФормы.Вставить("ДатаОтправки",                                       "");
        СтруктуруПараметровПечатнойФормы.Вставить("ДоговорНомер",                                       "");
        СтруктуруПараметровПечатнойФормы.Вставить("ДоговорДата",                                         "");
        СтруктуруПараметровПечатнойФормы.Вставить("ДатаИНомерТелефонограммыОтправителя",                 "");
        СтруктуруПараметровПечатнойФормы.Вставить("ПереченьНФА",                                         "");
        СтруктуруПараметровПечатнойФормы.Вставить("ДатаВремяПрибытияНаСтанцию",                       "");
        СтруктуруПараметровПечатнойФормы.Вставить("ДатаВремяВыдачиГрузаОрганомТранспорта",                 "");
        СтруктуруПараметровПечатнойФормы.Вставить("ДатаВремяВскрытияВагонаИДругихТранспортныхСредств", "");
        СтруктуруПараметровПечатнойФормы.Вставить("ДатаВремяДоставкиНаСкладПолучателя",               "");
        СтруктуруПараметровПечатнойФормы.Вставить("УсловияХраненияНаСкладеПолучателя",                     "");
        СтруктуруПараметровПечатнойФормы.Вставить("СостояниеТарыИУпаковкиВМоментОсмотраПродукции",         "");
        СтруктуруПараметровПечатнойФормы.Вставить("КоличествоНедостающейПродукцииОпределено",           "");
        СтруктуруПараметровПечатнойФормы.Вставить("ДругиеДанные",                                       "");
        СтруктуруПараметровПечатнойФормы.Вставить("ЗаключениеКомиссии",                               "");
        СтруктуруПараметровПечатнойФормы.Вставить("ПереченПрилагаемыхДокументов",                       "");
        СтруктуруПараметровПечатнойФормы.Вставить("Должность1",                                        "");
        СтруктуруПараметровПечатнойФормы.Вставить("Сотрудник1",                                        "");
        СтруктуруПараметровПечатнойФормы.Вставить("НомерДатаДокументаОВыдачеПолномочий",                 "");
        СтруктуруПараметровПечатнойФормы.Вставить("Должность2",                                        "");
        СтруктуруПараметровПечатнойФормы.Вставить("Сотрудник2",                                        "");
        СтруктуруПараметровПечатнойФормы.Вставить("НомерДатаДокументаОВыдачеПолномочи2",              "");
        СтруктуруПараметровПечатнойФормы.Вставить("Должность3",                                        "");
        СтруктуруПараметровПечатнойФормы.Вставить("Сотрудник3",                                        "");
        СтруктуруПараметровПечатнойФормы.Вставить("НомерДатаДокументаОВыдачеПолномочи3",              "");
        СтруктуруПараметровПечатнойФормы.Вставить("ДатаОприходованияМатериальныхЦенностей",           "");
        СтруктуруПараметровПечатнойФормы.Вставить("КоммерческийАктНомер",                               "");
        СтруктуруПараметровПечатнойФормы.Вставить("ЗаведующийСкладом",                                     "");
КонецЕсли;
    
    ВОзврат СтруктуруПараметровПечатнойФормы;
КонецФункции
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
&НаКлиенте
Процедура ПечатьМ7(Команда)
    СтруктураПараметров  = РаботаСПечатнымиФормами.ВернутьСтруктуруПараметровПечатнойФормы("М_7");
    ЗаполнитьСтруктуруПараметровПечати(СтруктураПараметров);
    РаботаСПечатнымиФормами.Печать_М_7(СтруктураПараметров);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСтруктуруПараметровПечати(СтруктураПараметров)
    СтруктураПараметров.Макет                                           =   ПолучитьОбщийМакет("М_7");
    СтруктураПараметров.Номер                                           =   Объект.Номер;
    СтруктураПараметров.Организация                                   =   Объект.Организация;
    СтруктураПараметров.КодОКПО                                           =   Объект.Организация.КодОКПО;
    
    СтруктураДанныхРуководителя                                          =   ОбщегоНазначения.ВернутьСтруктуруДанныхРуководителя(Объект.Дата, Объект.Организация);
    СтруктураПараметров.РуководительДолжность =                             ?(СтруктураДанныхРуководителя = Неопределено, "", СтруктураДанныхРуководителя.Должность);
    СтруктураПараметров.Руководитель  =                                  ?(СтруктураДанныхРуководителя = Неопределено, "", СтруктураДанныхРуководителя.Сотрудник);
    СтруктураПараметров.ДатаСоставленияДень =                                 Формат(День(Объект.Дата), "ЧЦ=2; ЧДЦ=0; ЧВН=; ЧГ=0");
    СтруктураПараметров.ДатаСоставленияМесяц =                               Формат(Месяц(Объект.Дата), "ЧЦ=2; ЧДЦ=0; ЧВН=; ЧГ=0");
    СтруктураПараметров.ДатаСоставленияГод =                               Формат(Год(Объект.Дата), "ЧЦ=4; ЧДЦ=0; ЧГ=0");
    СтруктураПараметров.Дата =                                               Объект.Дата;
    СтруктураПараметров.Склад =                                             Объект.Склад;
    СтруктураПараметров.ВремяНачалоПриемкиЧас =                             Формат(Час(Объект.ВремяНачалоПриемки), "ЧЦ=2; ЧДЦ=0; ЧН=00; ЧВН=; ЧГ=0");
    СтруктураПараметров.ВремяНачалоПриемкиМинута =                           Формат(Минута(Объект.ВремяНачалоПриемки), "ЧЦ=2; ЧДЦ=0; ЧН=00; ЧВН=; ЧГ=0");
    СтруктураПараметров.ВремяОкончанияПриемкиЧас =                           Формат(Час(Объект.ВремяОкончанияПриемки), "ЧЦ=2; ЧДЦ=0; ЧН=00; ЧВН=; ЧГ=0");
    СтруктураПараметров.ВремяОкончанияПриемкиМинута =                         Формат(Минута(Объект.ВремяОкончанияПриемки), "ЧЦ=2; ЧДЦ=0; ЧН=00; ЧВН=; ЧГ=0");
    СтруктураПараметров.СопроводительныйДокумент =                           Объект.СопроводительныйДокумент;
    СтруктураПараметров.УдостоверениеОКачествеНомер =                     Объект.УдостоверениеОКачествеНомер;
    СтруктураПараметров.Станция =                                             Объект.Станция;
    СтруктураПараметров.ТранспортныйДокументНомер =                         Объект.ТранспортныйДокументНомер;
    СтруктураПараметров.ТранспортныйДокументДата =                           Формат(Объект.ТранспортныйДокументДата, "ДФ=dd.MM.yyyy");
    СтруктураПараметров.ТранспортныйДокументВагоны =                       Объект.ТранспортныйДокументВагоны;
    СтруктураПараметров.Отправитель =                                         Объект.Отправитель;
    СтруктураПараметров.Поставщик =                                         Объект.Поставщик;
    СтруктураПараметров.Получатель =                                       Объект.Организация;
    СтруктураПараметров.СтраховаяКомпания =                                 Объект.СтраховаяКомпания;
    СтруктураПараметров.ДатаОтправки =                                       Формат(Объект.ДатаОтправки, "ДФ=dd.MM.yyyy");
    СтруктураПараметров.ДоговорНомер =                                       Объект.Договор.Номер;
    СтруктураПараметров.ДоговорДата =                                         Формат(Объект.Договор.Дата, "ДФ=dd.MM.yyyy");
    СтруктураПараметров.ДатаИНомерТелефонограммыОтправителя =                 Объект.ДатаИНомерТелефонограммыОтправителя;
    
    СтруктураПараметров.ПереченьНФА =                                         Новый Массив;
    
    Для Каждого Стр Из Объект.НФА Цикл
        СтруктураНФА    = Новый Структура;
        СтруктураНФА.Вставить("ВидУпаковки",         Стр.ВидУпаковки);
        СтруктураНФА.Вставить("ЕдИзм",                 Стр.ЕдИзм);
        СтруктураНФА.Вставить("Количество",       Стр.Количество);
        СтруктураНФА.Вставить("ОбъектНФА",             Стр.ОбъектНФА);
        СтруктураНФА.Вставить("Опломбировано",         ?(Стр.Опломбировано, "Опломбировано", ""));
        СтруктураНФА.Вставить("Масса",             ВернутьМассуДляМ_7(Стр.Количество, Стр.ОбъектНФА));
        СтруктураНФА.Вставить("ОтметкаОтправителя", Стр.ОтметкаОтправителя);
        
        СтруктураПараметров.ПереченьНФА.Добавить(СтруктураНФА);
    КонецЦикла;
    
    СтруктураПараметров.ДатаВремяПрибытияНаСтанцию =                       Объект.ДатаВремяПрибытияНаСтанцию;
    СтруктураПараметров.ДатаВремяВыдачиГрузаОрганомТранспорта =             Объект.ДатаВремяВыдачиГрузаОрганомТранспорта;
    СтруктураПараметров.ДатаВремяВскрытияВагонаИДругихТранспортныхСредств = Объект.ДатаВремяВскрытияВагонаИДругихТранспортныхСредств;
    СтруктураПараметров.ДатаВремяДоставкиНаСкладПолучателя =               Объект.ДатаВремяДоставкиНаСкладПолучателя;
    СтруктураПараметров.УсловияХраненияНаСкладеПолучателя =                 Объект.УсловияХраненияНаСкладеПолучателя;
    СтруктураПараметров.СостояниеТарыИУпаковкиВМоментОсмотраПродукции =     Объект.СостояниеТарыИУпаковкиВМоментОсмотраПродукции;
    СтруктураПараметров.КоличествоНедостающейПродукцииОпределено =           Объект.КоличествоНедостающейПродукцииОпределено;
    СтруктураПараметров.ДругиеДанные =                                       Объект.ДругиеДанные;
    СтруктураПараметров.ЗаключениеКомиссии =                               Объект.ЗаключениеКомиссии;
    СтруктураПараметров.ПереченПрилагаемыхДокументов =                       Объект.ПереченПрилагаемыхДокументов;
    СтруктураПараметров.Должность1 =                                        Объект.Должность1;
    СтруктураПараметров.Сотрудник1 =                                        Объект.Сотрудник1;
    СтруктураПараметров.НомерДатаДокументаОВыдачеПолномочий =                 Объект.НомерДатаДокументаОВыдачеПолномочий1;
    СтруктураПараметров.Должность2 =                                        Объект.Должность2;
    СтруктураПараметров.Сотрудник2 =                                        Объект.Сотрудник2;
    СтруктураПараметров.НомерДатаДокументаОВыдачеПолномочи2 =              Объект.НомерДатаДокументаОВыдачеПолномочий2;
    СтруктураПараметров.Должность3 =                                        Объект.Должность3;
    СтруктураПараметров.Сотрудник3 =                                        Объект.Сотрудник3;
    СтруктураПараметров.НомерДатаДокументаОВыдачеПолномочи3 =              Объект.НомерДатаДокументаОВыдачеПолномочий3;
    СтруктураПараметров.ДатаОприходованияМатериальныхЦенностей =           Объект.ДатаОприходованияМатериальныхЦенностей;
    СтруктураПараметров.КоммерческийАктНомер =                               Объект.КоммерческийАктНомер;
    СтруктураПараметров.ЗаведующийСкладом =                                 Объект.ЗаведующийСкладом;
КонецПроцедуры
1C
1
2
3
4
5
6
7
&НаКлиенте
Процедура Печать_М_7(СтруктураПараметров) Экспорт
    ТабДок    = РаботаСПечатнымиФормамиСервер.ВернутьТабДок_М_7(СтруктураПараметров);//ВернутьТабДок_М_7(СтруктураПараметров);
    
    ПараметрыФормыПечати        = Новый Структура("ТабДок", ТабДок);
    ОткрытьФорму("ОбщаяФорма.ФормаПечати", ПараметрыФормыПечати);
КонецПроцедуры

Могу ли я как то похожим способом реализовать (ибо в БП 3.0 совсееем по-другому все данные берутся) ?

Цитата
Сообщение от polax
Посмотреть сообщение

И все это ради чего? Если это реальная задача, то ВПФ не вмешивается в конфигурацию и в данном случае и по-проще (не просто, а чуть легче) и правильней расширения

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



0



Задача: при печати РКО сумма прописью должна выводится всегда. Конфигурация находится на поддержке

Конфигурация: BAS Бухгалтерія, редакція 2.1 (2.1.2.1)

Платформа: 1С:Предприятие 8.3 (8.3.14.1779)

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

  • внешние печатные формы
  • расширения

Воспользуемся новым для украинских конфигураци механизмом расширений.

Шаг 1. Заимствуем нужные объекты

Необходимо позаимствовать 2 печатных формы (ПФ_MXL_UK_КО2 и ПФ_MXL_UK_КО2_2018) и документ «Расходный кассовый ордер«. В документе нам необходим будет модуль менеджера.

Заимствуем объекты в расширение

Шаг 2. Редактируем модуль менеджера

В модуле менеджера необходимо обновить 2 процедуры (ДобавитьКомандыПечати и Печать) и добавить функцию ПечатьРКОСуммаПрописью, которая будет возвращать сформированный табличный документ.

&После("ДобавитьКомандыПечати")
Процедура ДобавитьКомандыПечатиРасш(КомандыПечати) Экспорт
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Идентификатор = "РКОСуммаПрописью";
	КомандаПечати.Представление = НСтр("ru='Расходный кассовый ордер (сумма прописью)';uk='Видатковий касовий ордер (сумма прописью)'");
	КомандаПечати.Обработчик    = "УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати";	
КонецПроцедуры

&После("Печать")
Процедура ПечатьРасш(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм,ОбъектыПечати, ПараметрыВывода) Экспорт
	
	// Устанавливаем признак доступности печати покомплектно.
	ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;
	
	// Проверяем, нужно ли для макета РКО формировать табличный документ.
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "РКОСуммаПрописью") Тогда
		
		// Формируем табличный документ и добавляем его в коллекцию печатных форм.
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "РКОСуммаПрописью", НСтр("ru='Расходный кассовый ордер';uk='Видатковий касовий ордер'"), 
			ПечатьРКОСуммаПрописью(МассивОбъектов, ОбъектыПечати), , "ОбщийМакет.ПФ_MXL_UK_КО2");
	КонецЕсли;
	
КонецПроцедуры


// Функция формирует табличный документ с печатной формой накладной,
// разработанной методистами
//
// Возвращаемое значение:
//  Табличный документ - печатная форма накладной
//
Функция ПечатьРКОСуммаПрописью(МассивОбъектов, ОбъектыПечати)

	УстановитьПривилегированныйРежим(Истина);
	
	ВалютаРегламентированногоУчета = ОбщегоНазначенияБПВызовСервераПовтИсп.ПолучитьВалютуРегламентированногоУчета();
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);

	Запрос.Текст =
	"ВЫБРАТЬ
	|	Ссылка,
	|	Номер,
	|	Дата                          КАК ДатаДокумента,
	|	Организация,
	|	ВидОперации,
	|	СчетКасса,
	|	ОбособленноеПодразделениеОрганизации,
	|	ОбособленноеПодразделениеОрганизации.НаименованиеПолное КАК ОбособленноеПодразделениеОрганизацииПредставление,
	|	СуммаДокумента                КАК Сумма,
	|	Контрагент,
	|	Контрагент.Представление      КАК ФИОПолучателя,
	|	ВалютаДокумента               КАК Валюта,
	|	ВалютаДокумента.Представление КАК ВалютаПредставление,
	|	Выдать,
	|	Приложение,
	|	ПоДокументу,
	|	Основание,
	|	НомерОрдера
	|ИЗ
	|	Документ.РасходныйКассовыйОрдер КАК РасходныйКассовыйОрдер
	|
	|ГДЕ
	|	РасходныйКассовыйОрдер.Ссылка В(&МассивОбъектов)";

	Шапка = Запрос.Выполнить().Выбрать();
	ПервыйДокумент = Истина;
	
	ТабДокумент   = Новый ТабличныйДокумент;
	ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_РасходныйКассовыйОрдер_КО2";
	
	Пока Шапка.Следующий() Цикл

		Если НЕ ПервыйДокумент Тогда
			ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
		КонецЕсли;
		
		ПервыйДокумент = Ложь;
		// Запомним номер строки, с которой начали выводить текущий документ.
		НомерСтрокиНачало = ТабДокумент.ВысотаТаблицы + 1;
		
		Вариант2018 = Истина;
		Если Шапка.ДатаДокумента >= Дата('20180105') Тогда
			Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.ПФ_MXL_UK_КО2_2018");
		Иначе
			Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.ПФ_MXL_UK_КО2");
			Вариант2018 = Ложь;
		КонецЕсли;
		
		ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
		КодЯзыкаПечать = "uk";
		
		СведенияОбОрганизации = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(Шапка.Организация, Шапка.ДатаДокумента);
		
		// Выводим шапку накладной
		ОбластьМакета.Параметры.Заполнить(Шапка);
		
		Если Вариант2018 Тогда
			ПредставлениеДаты = Формат(Шапка.ДатаДокумента, "Л=uk_UA; ДЛФ=DD");
			ПредставлениеДаты = Сред(ПредставлениеДаты, 1, СтрДлина(ПредставлениеДаты) - 2) + "року";
			ОбластьМакета.Параметры.ДатаДокументаШапка = ПредставлениеДаты;
		КонецЕсли;
		
		Если НЕ ЗначениеЗаполнено(Шапка.ОбособленноеПодразделениеОрганизации) Тогда
			ОбластьМакета.Параметры.ПолноеНаименование 	= СведенияОбОрганизации.ПолноеНаименование;
		Иначе
			ОбластьМакета.Параметры.ПолноеНаименование = Шапка.ОбособленноеПодразделениеОрганизацииПредставление;
		КонецЕсли;
		
		ОбластьМакета.Параметры.Сумма             	= ОбщегоНазначенияБПВызовСервера.ФорматСумм(Шапка.Сумма, Шапка.Валюта);
		
		//Если Вариант2018 И (Шапка.ВидОперации = Перечисления.ВидыОперацийРКО.ВзносНаличнымиВБанк
		//	Или Шапка.ВидОперации = Перечисления.ВидыОперацийРКО.ВыплатаЗаработнойПлатыПоВедомостям
		//	Или Шапка.ВидОперации = Перечисления.ВидыОперацийРКО.ИнкассацияДенежныхСредств) Тогда 
		//	ОбластьМакета.Параметры.СуммаПрописью = ?(Шапка.Валюта = ВалютаРегламентированногоУчета, "грн      коп.", "");
		//	ОбластьМакета.Область("R15C2:R15C8").ГоризонтальноеПоложение = ГоризонтальноеПоложение.Право;
		//Иначе
			ОбластьМакета.Параметры.СуммаПрописью = ОбщегоНазначенияБПВызовСервера.СформироватьСуммуПрописью(Шапка.Сумма, Шапка.Валюта, КодЯзыкаПечать);
		//КонецЕсли;
		
		
		Если Шапка.Валюта = ВалютаРегламентированногоУчета Тогда
			ОбластьМакета.Параметры.СуммаПрописьюПолучил = ?(Вариант2018, "грн      коп.", "грн.      коп.");
		Иначе
			ОбластьМакета.Параметры.СуммаПрописьюПолучил = "";
		КонецЕсли;
		
		Попытка
				ОбластьМакета.Параметры.КодПоЕДРПОУ 		= БухгалтерскийУчетПереопределяемый.ПолучитьКодОрганизации(СведенияОбОрганизации);	
		Исключение
		    //ОписаниеОшибки()
		КонецПопытки;
		
		Если НЕ ЗначениеЗаполнено(Шапка.ОбособленноеПодразделениеОрганизации) Тогда
			Руководители = ОтветственныеЛицаБП.ОтветственныеЛица(Шапка.Организация, Шапка.ДатаДокумента);
		Иначе
			Руководители = ОтветственныеЛицаБП.ОтветственныеЛицаОбособленногоПодразделения(Шапка.ОбособленноеПодразделениеОрганизации, Шапка.ДатаДокумента);
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Руководители.РуководительФИО) Тогда
			ОбластьМакета.Параметры.ФИОРуководителя = ОбщегоНазначенияБПВызовСервера.ПолучитьФамилиюИмяОтчество(Руководители.РуководительФИО.Фамилия, Руководители.РуководительФИО.Имя, Руководители.РуководительФИО.Отчество, Истина); // Кратко
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Руководители.ГлавныйБухгалтерФИО) Тогда
			ОбластьМакета.Параметры.ФИОБухгалтера   = ОбщегоНазначенияБПВызовСервера.ПолучитьФамилиюИмяОтчество(Руководители.ГлавныйБухгалтерФИО.Фамилия, Руководители.ГлавныйБухгалтерФИО.Имя, Руководители.ГлавныйБухгалтерФИО.Отчество, Истина); // Кратко
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Руководители.КассирФИО) Тогда
			ОбластьМакета.Параметры.ФИОКассира      = ОбщегоНазначенияБПВызовСервера.ПолучитьФамилиюИмяОтчество(Руководители.КассирФИО.Фамилия, Руководители.КассирФИО.Имя, Руководители.КассирФИО.Отчество, Истина); // Кратко
		КонецЕсли;
		
		Запрос = Новый Запрос;
		Запрос.УстановитьПараметр("ТекущийДокумент", Шапка.Ссылка);
		
		Запрос.УстановитьПараметр("Счет", Шапка.СчетКасса);
		
		Запрос.Текст =
		"ВЫБРАТЬ
		|	Проводки.СчетДт КАК СчетДт
		|ИЗ
		|	РегистрБухгалтерии.Хозрасчетный КАК Проводки
		|
		|ГДЕ
		|	Проводки.Регистратор = &ТекущийДокумент И
		|	Проводки.СчетКт = &Счет"+
		?( Шапка.СчетКасса.Валютный, "
		|// проводки по курсовой разнице (без валютной суммы) пропускаем
		|	И Проводки.ВалютнаяСуммаКт <> 0","");
		
		ВыборкаСчетов = Запрос.Выполнить().Выбрать();
		
		СписокСчетов = ""; Разделитель = "";
		
		Пока ВыборкаСчетов.Следующий() Цикл
			Если Найти(СписокСчетов, Строка(ВыборкаСчетов.СчетДТ)) <> 0 Тогда
				Продолжить;
			КонецЕсли;	
			СписокСчетов = СписокСчетов + Разделитель + Строка(ВыборкаСчетов.СчетДТ);
			Разделитель = ", ";
		КонецЦикла;	
		ОбластьМакета.Параметры.Счет = СписокСчетов;
		
		
		ТабДокумент.Вывести(ОбластьМакета);
		
		// В табличном документе зададим имя области, в которую был 
		// выведен объект. Нужно для возможности печати покомплектно.
		УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабДокумент, 
		НомерСтрокиНачало, ОбъектыПечати, Шапка.Ссылка);
		
	КонецЦикла;

	Возврат ТабДокумент;

КонецФункции // ПечатьРКО()

Проверяем.

Новый элемент списка в меню печати

Печатная форма формируется, но немного странная: отстуствует КодПоЕДРПОУ и текст «Додаток 3«:

Разница в напечатанных РКО

Любопытная ситуация. Макет печатной формы возвращает функция УправлениеПечатью.МакетПечатнойФормы. С помощью инструментов разработчика (Функция Ис() при отладке) проверим, какую форму возвращает «чистая» конфигурация, а какую конфигурация с расширением:

Разница в макетах между "чистой" конфигурацией и расширением

Интересное поведение платформы. Объяснения, честно говоря, нет.

Шаг 3. Копируем печатные формы в расширение

Опытным путем было выяснено: для решения задачи с помощью расширений необходимо не заимствовать общие печатные формы, а копировать их в расширение и переименовать. В коде небходимо обращаться к скопированным макетам по именам:

Исправленное расширение

Расширение, макет печатной формы

Я
   Momus

20.03.20 — 10:27

При добавлении макета табличного документа в расширение 1с «не видит» новый макет и использует старый. Вместо этого я создаю новый макет и вношу некоторые изменения в обработку печати. Я как-то не так добавляю макет в расширение или так и должно быть? Использование ВПФ не предлагать.

   yurikmellon2

1 — 20.03.20 — 10:31

(0) убедись, что в эту ПФ не внесены изменения в пользовательском режиме

   Momus

2 — 20.03.20 — 10:37

(1) убедился, не внесены

   Momus

3 — 20.03.20 — 10:38

Обратил внимание, что предыдущий разработчик также создавал _новый_ макет в расширениях.

   Momus

4 — 20.03.20 — 10:41

Бывают ли у вас проблемы с макетом в расширении? Если нет, то буду искать решение, чтоб не плодить объекты лишний раз

   yurikmellon2

5 — 20.03.20 — 10:44

(2) хм, странно. Все правильно ты делаешь. Если забрать ПФ в расширение, то берется именно версия ПФ из макета.

Вот только что, ради эксперимента добавил ПФ в расширение, поменял цвет заголовка, ПФ в режиме предприятия изменилась.

Т.е. нет проблем с макетом в расширении

Попробуй кэш что ли почистить…

   Momus

6 — 20.03.20 — 10:50

(5) кстати та ПФ, которая была добавлена в расширение и изменена в общем списке макетов (в режиме предприятие) изменилась, но при вызове ПФ УправлениеПечатью.МакетПечатнойФормы(«Документ.СписаниеОС.ПФ_MXL_ОС4») макет остается без изменений. Попробую почистить кэш и вправду.

   Фрэнки

7 — 20.03.20 — 10:50

Кэш и демоническое поведении при накатывании таких расширений, не затрагивающих структуры данных, а только вспомогательные данные, вроде макетов, форм, обработок и т.д.

   Momus

8 — 20.03.20 — 10:56

(7) такое демоническое поведение это редкость или правило? А то щас накачу обновление под выходные…

  

Momus

9 — 20.03.20 — 11:01

(8) впредь буду создавать новые, а не заимствовать, чтобы избежать таких ошибок

Здесь можно задать вопрос «Как сделать?» и получить кучу ответов, что тебе это делать не надо. Ymryn

ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку «Обновить» в браузере.

Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить песчаную почву
  • Как изменить персональные данные на сайте пфр
  • Как изменить персональные данные на сайте госуслуги
  • Как изменить персональные данные на мегафоне
  • Как изменить персональные данные на госуслугах после замужества

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии