История изменения контактной информации контрагентов, на примере cохранения истории изменений адресов партнеров и контрагентов, для УТ 11.2

13.01.17

Задачи пользователя - Адаптация типовых решений

Сохраняем историю изменений адресов партнеров и контрагентов для УТ 11.2 с возможностью печати документов задним числом с нужными адресами. В публикации описаны необходимые минимальные доработки конфигурации для: хранения истории изменений и автоматической подстановки нужного адреса (в зависимости от даты) в печатные бланки.

Скачать исходный код

Наименование Файл Версия Размер
ЗаполнитьИсториюТекущимиКонтактнымиДанными
.epf 7,02Kb
3
.epf 7,02Kb 3 Скачать

Доработка тестировалась на конфигурации: Управление Торговлей 11.2 (11.2.3.129).

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

Реализация:

1) Создадим периодический "Регистр сведений", в котором будем хранить историю контактной информации.

- Наименование: ИсторияКонтактнойИнформации
- Синоним: История изменения контактной информации 
- Переодичность: В пределах секунды
- Режим записи : Независимый
- Измерения: Объект(СправочникСсылка.Контрагенты, СправочникСсылка.Партнеры), Тип, Вид, ВидДляСписка
- Ресурсы: Представление, ЗначенияПолей, Страна, Регион, Город, АдресЭП, ДоменноеИмяСервера, НомерТелефона, НомерТелефонаБезКодов

Измерения и ресурсы полностью взяты из табличной части "КонтактнаяИнформация" справочника "Контрагенты", кроме имерения "Объект". Данный регистр сведений позволит хранить историю любую контактной информации справочников "Партнеры" и "Контрагенты".
Не забываем на вкладке "права" настроить права для нужных ролей.

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

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

            Иначе
                
                //Сравним каждую колонку...
                Для каждого Рек из РеквизитыКонтактнойИнформации Цикл
                    Если масСтрок[0][Рек.имя] <> стрИнф[Рек.имя] Тогда
                        СохранятьКонтактнуюИнформацию = Истина;
                        Прервать;
                    КонецЕсли;    
                КонецЦикла;    
                
            КонецЕсли;    
            
        КонецЕсли;    
        
        //Сохраняем...
        Если СохранятьКонтактнуюИнформацию Тогда    
            
            НовКонИнф = РегистрыСведений.ИсторияКонтактнойИнформации.СоздатьМенеджерЗаписи();
            НовКонИнф.Объект = спрОбъект.Ссылка;
            НовКонИнф.Период = текДата;
        
            Для каждого Рек из РеквизитыКонтактнойИнформации Цикл
                НовКонИнф[Рек.имя] = стрИнф[Рек.имя];    
            КонецЦикла;    
        
            НовКонИнф.Записать();
            
        КонецЕсли;    
        
    КонецЦикла;
    
КонецПроцедуры 

   

3) В модуле объекта справочников "Партнеры" и "Контрагенты" в процедуре "ПередЗаписью" вызовем нашу процедуру "СохранитьИсториюКонтактнойИнформации". На данном этапе доработки история контактной информации уже будет сохраняться. 

4) В модуле менеджера нашего регистра сведений создадим экспортную функцию "ПолучитьПредставление". 

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

5) Для того, чтобы при печати адреса подставлялись из нашей сохраненной истории, вызовем функцию "ПолучитьПредставление" из модуля менеджера нашего регистра сведений. Место, откуда будем вызывать функцию, - это модуль "ФормированиеПечатныхФорм", в нем ищем функцию "ПолучитьАдресИзКонтактнойИнформации". Комментируем кусок кода и вызываем нашу функцию, как показано на скрине ниже.

6) В этом же модуле находим функцию "СведенияОЮрФизЛице" и добавляем параметр "ДатаПериода" в вызов функции "ПолучитьАдресИзКонтактнойИнформации".

7) Все готово.

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

история адресов сохранить историю адресов история изменения адресов УТ

См. также

Табличная часть в доп. реквизитах и формирование таблиц в шаблоне docx для 1С:ДО 3.0

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    4645    9    5    

18

Расширение для 1С:УНФ. Автоматическое снятие резервов в Заказах покупателей

Логистика, склад и ТМЦ Адаптация типовых решений Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    3055    4    0    

19

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1681    dimanich70    8    

14

Доработка отчета "Связанные документы" (структура подчиненности) для вывода объектов из любого расширения

Адаптация типовых решений Платформа 1С v8.3 1С:Управление торговлей 11 Россия Абонемент ($m)

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

1 стартмани

27.10.2023    2105    19    avmartynov    14    

44

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2230    25    progmaster    8    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. gzharkoj 504 15.09.16 08:40 Сейчас в теме
А чем вам не подошел стандартный механизм версионирования?
h00k; +1 1
2. sergey512 35 15.09.16 12:56 Сейчас в теме
(1) ifal, При использовании стандартного механизма версионирования, получим только историю изменения для просмотра. При печати документов задним числом, в печатный бланк будут подставляться текущие данные контактной информации, а не данные актуальные на дату документа. Т.е.перед печатью задним числом, придется менять все вручную. В способе описанном выше, адрес в печатный бланк подставится актуальный на дату документа. Аналогично адресу, можно подставлять и другие актуальные, на дату документа, данные из контактной информации.
+
3. gzharkoj 504 15.09.16 13:42 Сейчас в теме
(2) Вы не поняли, что я спрашиваю. Я хочу узнать зачем делать новый регистр сведений, писать код, чтобы туда что-то сохранять, если есть подсистема версионирования, которая все это делает из коробки. Остается только достать оттуда данные и все. А в Платформе 8.3.9 можно будет через расширение решить вашу задачу, не снимая с поддержки конфигурацию, если опираться на версионирование.
4. sergey512 35 15.09.16 14:07 Сейчас в теме
(3) ifal, Согласен. Моя публикация - это всего лишь пример решения данной задачи. В ближайшее время напишу публикацию, по решению данной задачи с помощью механизма версионирования. Интересно будет сравнить быстродействие работы двух вариантов реализации.
+
5. bluntschi 15.12.22 12:03 Сейчас в теме
(4)добрый день, а удалось сделать с помощью механизма версионирования?
+
Оставьте свое сообщение