gifts2017

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

Опубликовал Александр Хоменко (scape) в раздел Программирование - Практика программирования

Иногда возникает необходимость быстро внести незначительные (или значительные) единичные изменения в печатную форму документа или справочника. Для этого редактируется табличный документ печатной формы, после чего форма распечатывается. Но если возникает необходимость заново распечатать форму, внесенные изменения исчезают (Вернее они исчезают в том момент, когда форма была закрыта). Можно сохранить изменения в файл, но как то надо сопоставлять файл с документом, и можно просто забыть, что и куда сохранялось.
Ниже представлен алгоритм доработки конфигурации который позволяет автоматически сохранять измененные печатные формы в конфигурации с привязкой к документу или справочнику. Для бухгалтерии 2.0

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

Алгоритм рассмотрим на примере документа "Счет на оплату покупателю".
Документу добавлены две печатные формы "Счет договор" и "Спецификация".

1. Добавим документу два реквизита типа "Хранилище значения" - ПечатнаяФормаСчета и ПечатнаяФормаСпецификации. В них будут храниться измененные табличные документы.


2. Создаем общий модуль или используем существующий. Добавим в него функцию:

Функция ОткрытьСохраненнуюПечатнуюФорму( п_РеквизитХранилище ) Экспорт
    
    ТабДокумент = п_РеквизитХранилище.Получить();
    Если ТабДокумент <> Неопределено Тогда
        Ответ = Вопрос("Печатная формы была изменена и сохранена. Открыть сохраненный вариант? Да - Открыть; Нет - Сформировать заново.", РежимДиалогаВопрос.ДаНетОтмена );
        Если Ответ = КодВозвратаДиалога.Отмена Тогда
            Возврат "Отмена";
        ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда
            Возврат Неопределено;
        КонецЕсли;
    КонецЕсли;    
    
    Возврат ТабДокумент;
    
КонецФункции


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

3. Вносим изменения в общую форму "ФормаПечати".

А. Изменям тип реквизита формы "Документ" на составной ДокументСсылка, СправочникСсылка (что бы можно было сохранять печатные формы справочников)

Б. Добавляем в модуль процедуру:

Процедура СохранитьПечатнуюФорму( п_Реквизит )
    
    Если Модифицированность Тогда
        Ответ = Вопрос( "Печатная форма была изменена. Сохранить изменения?", РежимДиалогаВопрос.ДаНетОтмена );
        Если Ответ = КодВозвратаДиалога.Отмена Тогда
            Отказ = Истина;
            Возврат;
        КонецЕсли;    
        Если Ответ = КодВозвратаДиалога.Да Тогда
            Объект = Документ.ПолучитьОбъект();
            ПечатныйДокумент.ВставитьОбласть(ЭлементыФормы.ПолеДокумента.Область());
            ХЗ = Новый ХранилищеЗначения(ПечатныйДокумент, Новый СжатиеДанных(9));
            Объект[п_Реквизит] = ХЗ;
            Объект.Записать();
        КонецЕсли;    
    КонецЕсли;    
    
КонецПроцедуры 
   

Процедура проверяет модифицированность формы печати и предлагает сохранить изменения.

В. и обработчик ПередЗакрытием:

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    
    Если ТипЗнч( Документ ) = Тип( "СправочникСсылка.ДоговорыКонтрагентов" ) Тогда
        СохранитьПечатнуюФорму( "ПечатнаяФорма" );
    ИначеЕсли ТипЗнч( Документ ) = Тип( "ДокументСсылка.СчетНаОплатуПокупателю" ) Тогда
        Если ИмяМакета = "Спецификация" Тогда
            СохранитьПечатнуюФорму( "ПечатнаяФормаСпецификации" );
        ИначеЕсли ИмяМакета = "СчетСпец" Тогда
            СохранитьПечатнуюФорму( "ПечатнаяФормаСчета" );
        КонецЕсли;    
    КонецЕсли;    
    
КонецПроцедуры

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

4. Корректируем процедуру Печать модуля документа "Счет на оплату покупателю":

Процедура Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь, НепосредственнаяПечать = Ложь) Экспорт
    
    // Получить экземпляр документа на печать
    Если ИмяМакета = "Счет" Тогда
       
        ТабДокумент = ПечатьСчетаЗаказа(ИмяМакета);
       
    //ИЗМЕНЕНИЯ        
    ИначеЕсли ИмяМакета = "СчетСпец" Тогда
        ТабДокумент = СпецПечатныеФормы.ОткрытьСохраненнуюПечатнуюФорму( ПечатнаяФормаСчета );
        Если ТабДокумент = "Отмена"  Тогда
            Возврат;
        ИначеЕсли ТабДокумент = Неопределено Тогда
            ТабДокумент = ПечатьСчета( ИмяМакета );    
        КонецЕсли;    
    ИначеЕсли ИмяМакета = "Спецификация" Тогда
        ТабДокумент = СпецПечатныеФормы.ОткрытьСохраненнуюПечатнуюФорму( ПечатнаяФормаСпецификации );
        Если ТабДокумент = "Отмена"  Тогда
            Возврат;
        ИначеЕсли ТабДокумент = Неопределено Тогда
            ТабДокумент = ПечатьСпецификации();    
        КонецЕсли;    
    //ИЗМЕНЕНИЯ        
       
    КонецЕсли;
    
    //ИЗМЕНЕНИЯ        
    //УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, ОбщегоНазначения.СформироватьЗаголовокДокумента(ЭтотОбъект, ""), НепосредственнаяПечать);

    УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, ОбщегоНазначения.СформироватьЗаголовокДокумента(ЭтотОбъект, ""), НепосредственнаяПечать, Ссылка, ИмяМакета);
    //ИЗМЕНЕНИЯ        
    
КонецПроцедуры


Здесь видно как используется процедура ОткрытьСохраненнуюПечатнуюФорму которая, в данном примере, описана в общем модуле СпецПечатныеФормы.
Обратите внимание, что в процедуру "НапечататьДокумент" так же передаются Ссылка и ИмяМакета.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. bonni (bonni80@mail.ru) 26.10.11 05:57
2. Юлия Малышева (unis) 26.10.11 09:20
Очень интересно и нужно.
Только помогите мне пожалуйста. Куда это все вносить?
заранее очень благодарна за подсказку!!!
3. Александр Хоменко (scape) 26.10.11 14:34
Вообще то здесь уже написано, что и куда вносить! Если не понятно, то совет, найти того кто понимает. Извините пожалуйста...
acapulco; +1 Ответить
4. Юлия Малышева (unis) 26.10.11 14:49
Вернее я понимаю куда это вносить.
просто куда именно: просто продолжить или полностью поменять алгоритм.
или где-то оставить, а где-то продолжить?
5. Alex Koso (AlexKoso) 26.10.11 15:28
(4) unis, вообще ценность этой публикации не в коде, а в самой идее. Само собой у многих возникнут свои пожелания и взгляды на реализацию. А когда кто-то на форуме пишет "Вернее я понимаю куда это вносить.
просто куда именно?" мне становится страшно за судьбу вашего клиента. Перестаньте заниматься не своим делом.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа