Универсальная история изменения документов и справочников

Публикация № 74378 29.09.10

Приемы и методы разработки - Универсальные функции

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

Универсальная история изменения документов и справочников, позволяет сохранять изменения только тех реквизитов документов, справочников, а также их табличных частей, которые действительно изменились. Те реквизиты которые не изменились не попадают в историю. Это позволяет отслеживать кто, когда и что именно изменил в документе или справочнике. Не имеет ссылок на объекты метаданных, что позволяет удалять объекты метаданных, помеченных на удаление, через обработку удаление помеченных на удаление, без проверки на ссылание этого объекта в этом справочнике.

Чтобы эту историю внедрить в Вашу конфигурацию, необходимо:

  1. Создать Справочник ИзмененияДокументов со следующими параметрами:
  2. Длина наименования 150, Длина кода 20, Тип Кода Строка.
    Реквизиты Справочника:
               Пользователь - Тип:СправочникСсылка.Пользователи
               GUID_Объекта - Тип:Строка, Длина: 36
               ДатаИзменения - Дата, Состав даты: Дата и время
          Табличная часть "Изменения" справочника, содержит Реквизиты:
               Реквизит - Тип:Строка, Длина:200
               ЗначениеДо - Тип: Строка, неограниченная
               ЗначениеПосле - Тип: Строка, неограниченная

  3. Создать ФормуСписка и ФормуЭлемента Справочника, в форме элемента сделать её только для просмотра.

  4. В общем модуле, который выполняется на клиенте, либо создав новый, разместить экспортируемую процедуру:

	 Процедура ЗаписатьИзмененияДокументаВСправочникИзмененияДокументов(Объект) ЭКСПОРТ

    Если Объект.ЭтоНовый() Тогда
        ID = Новый УникальныйИдентификатор;
        Если Сред(Объект.Метаданные().ПолноеИмя(), 1, Найти(Объект.Метаданные().ПолноеИмя(), ".")-1) = "Документ" Тогда
            Объект.УстановитьСсылкуНового(Документы[Объект.Метаданные().Имя].ПолучитьСсылку(ID));
        ИначеЕсли Сред(Объект.Метаданные().ПолноеИмя(), 1, Найти(Объект.Метаданные().ПолноеИмя(), ".")-1) = "Справочник" Тогда
            Объект.УстановитьСсылкуНового(Справочники[Объект.Метаданные().Имя].ПолучитьСсылку(ID));
        КонецЕсли;
    КонецЕсли;

    Изменения = Истина;
    ДатаИзм = ТекущаяДата();

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

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

    //Проверка на изменение табличных частей документа
    Для Каждого ТЧ из Объект.Метаданные().ТабличныеЧасти Цикл

        ЗапросПроверкаТЧ = Новый Запрос;

        ЗапросПроверкаТЧ.Текст = "ВЫБРАТЬ
                                     |  *
                                     |ИЗ
                                     |  " + Сред(Объект.Метаданные().ПолноеИмя(), 1, Найти(Объект.Метаданные().ПолноеИмя(), ".")) + Объект.Метаданные().Имя + "." + ТЧ.Имя + " КАК ОбъектМетаданных
                                     |ГДЕ
                                     |  ОбъектМетаданных.Ссылка = &Ссылка
                                     |УПОРЯДОЧИТЬ ПО
                                     |  НомерСтроки";

        ЗапросПроверкаТЧ.УстановитьПараметр("Ссылка", Объект.Ссылка);
        ВыборкаПроверкаТЧ = ЗапросПроверкаТЧ.Выполнить().Выбрать();
        Для Каждого СтрТЧ Из Объект[ТЧ.Имя] Цикл
            Если ВыборкаПроверкаТЧ.Следующий() Тогда
                Для Каждого Рек Из Объект.Метаданные().ТабличныеЧасти[ТЧ.Имя].Реквизиты Цикл
                    Если СтрТЧ[Рек.Имя] <> ВыборкаПроверкаТЧ[Рек.Имя] Тогда
                        Если Изменения Тогда
                            НовЭлемент = Справочники.ИзмененияДокументов.СоздатьЭлемент();
                            НовЭлемент.Наименование = Строка(Объект.Ссылка);
                            НовЭлемент.GUID_Объекта = Объект.Ссылка.УникальныйИдентификатор();
                            НовЭлемент.Пользователь = ПараметрыСеанса.ТекущийПользователь.Ссылка;
                            НовЭлемент.ДатаИзменения = ДатаИзм;
                            Изменения = Ложь;
                        КонецЕсли;
                        НовСтр = НовЭлемент.Изменения.Добавить();
                        НовСтр.Реквизит = ТЧ.Имя + ":" + Строка(СтрТЧ.НомерСтроки) + " - " + Рек.Имя;
                        НовСтр.ЗначениеДо = Строка(ВыборкаПроверкаТЧ[Рек.Имя]);
                        НовСтр.ЗначениеПосле = Строка(СтрТЧ[Рек.Имя]);
                        Если НовЭлемент.Изменения.Количество() = 99999 Тогда
                            НовЭлемент.Записать();
                            Изменения = Истина;
                        КонецЕсли;
                    КонецЕсли;
                КонецЦикла;
            Иначе
                Для Каждого Рек Из Объект.Метаданные().ТабличныеЧасти[ТЧ.Имя].Реквизиты Цикл
                    Если Изменения Тогда
                        НовЭлемент = Справочники.ИзмененияДокументов.СоздатьЭлемент();
                        НовЭлемент.Наименование = Строка(Объект.Ссылка);
                        НовЭлемент.GUID_Объекта = Объект.Ссылка.УникальныйИдентификатор();
                        НовЭлемент.Пользователь = ПараметрыСеанса.ТекущийПользователь.Ссылка;
                        НовЭлемент.ДатаИзменения = ДатаИзм;
                        Изменения = Ложь;
                    КонецЕсли;
                    НовСтр = НовЭлемент.Изменения.Добавить();
                    НовСтр.Реквизит = ТЧ.Имя + ":" + Строка(СтрТЧ.НомерСтроки) + " - " + Рек.Имя;
                    НовСтр.ЗначениеДо = "";
                    НовСтр.ЗначениеПосле = Строка(СтрТЧ[Рек.Имя]);
                    Если НовЭлемент.Изменения.Количество() = 99999 Тогда
                        НовЭлемент.Записать();
                        Изменения = Истина;
                    КонецЕсли;
                КонецЦикла;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;

    Если Не Изменения Тогда
        НовЭлемент.Записать();
    КонецЕсли;

КонецПроцедуры

И в нужном документе/справочнике в модуле объекта вконце процедуры ПередЗаписью() размещаем следующее:

	 #Если Клиент Тогда
Если Не Отказ Тогда
    НашиДороботки.ЗаписатьИзмененияДокументаВСправочникИзмененияДокументов(ЭтотОбъект);
КонецЕсли;
#КонецЕсли

4. На форме документа/Элемента объекта метаданных документа/справочника, для которого необходимо отслеживать историю изменений, можно разместить кнопку "История изменений", которая будет отбирать из справочника только те элементы которые по данному документу/справочнику. Для этого разместим кнопку на командной панели(ну или где Вам угодно) и в обработчике нажатия на кнопку  написать следующее:

	 Процедура ДействияФормыИсторияИзменений(Кнопка)

    ФормаИзменений = Справочники.ИзмененияДокументов.ПолучитьФормуСписка();
    ФормаИзменений.СправочникСписок.Отбор.GUID_Объекта.ВидСравнения = ВидСравнения.Равно;
    ФормаИзменений.СправочникСписок.Отбор.GUID_Объекта.Использование = Истина;
    ФормаИзменений.СправочникСписок.Отбор.GUID_Объекта.Значение = Строка(ЭтотОбъект.Ссылка.УникальныйИдентификатор());

    ФормаИзменений.Открыть();

КонецПроцедуры

Обновляем информационную базу и все. При каждом изменении в справочник добавляются элементы (изменения которые внесли пользователи). Думаю данная история изменений будет кому-то интересна и удобна.

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. e.kogan 1869 29.09.10 16:50 Сейчас в теме
Почему не оформлено как подсистема? (О том, что баян - промолчу)
7. sazol 30.09.10 13:41 Сейчас в теме
(1) Извините новичек еще, первая публикация... Сам написал это еще ы 2009 году, решил щас поделиться, может кому пригодиться...

(4) Бывают такие большие документы, где производсится изменений более чем 99999, а ограничение табличной части есть 99999 строк, для этого и есть данная проверка, он записывает один элемент истории и создает другой элемент, где указываются оставшиеся изменения после 99999. Надеюсь внятно разъяснил)) (на практике встретил, пришлось добавить данное условие ибо не дает тогда записать такие большие документы...)

(5) Извиняюсь за орфографическую ошибку)))

(6) а затем чтобы быстро(по одному щелчку мыши) и любой компентентый юзер мог просмотреть историю изменения документов или справочников.

(6) А выполнение на клиенте это и есть гуд! Так как на сервер объект не передашь ибо мутабельное значение, и на сервере не сможешь проверить какие на данный момент времени перед записью значения в объекте, а какие еще пока хранятся в базе, чтобы выявить изменения вносимые текущим юзером.
Для этого предусматривается разграничение прав на данный справочник, всем абсолютно юзерам даются права на добавление, просмотр и ввод по строке. (ни каких изменений в истории никто не сможет сделать, а это уже хорошо).
Если ты имел ввиду про дополнительный обработчик, который на стороне клиента, ну это не 8.2 с тонким клиентом чтоб так беспокоится, на 8.1 он итак очень "толстый" и сильно не "напрягает" клиент.
9. w-divin 30.09.10 15:10 Сейчас в теме
(7) с такими объемами как вы описываете (и с какими я работал) база дохнет довольно быстро... По крайней мере у нас документы правлись по 5-10 раз на дню, и документы и документоооборот немаленькие. Держать эту информацию в базе ИМХО нецелесообразно, хотя бы потому что сам просмотр изменений вызывается крайне редко по отношению к вводу документов и получениям данных из базы...

по поводу сервера - например XML-сериализацию еще никто не отменял... поищи на просторах интернета примеры проведения документов на сервере в привелигированых модулях... у нас в разных базах реализовано 3 схемы хранения истории изменений: XML, отдельная sql-база, отдельная 1С-база, в зависимости от объема рабочей базы и частоты изменений используем одну из них... вся обработка истории проходит на сервере со всеми вытекающими плюсами (с использованием привилегированных модулей)...

опять же - "чтобы быстро(по одному щелчку мыши) и любой компентентый юзер мог просмотреть историю" это совершенно не зависит от расположения данных

плюс: "Бывают такие большие документы, где производсится изменений более чем 99999" 99999 раз получать размер тч, тем более на клиенте - ну не есть это гут... совсем не есть...

"на 8.1 он итак очень "толстый"" во-первых все зависит от конфы, а во-вторых зачем еще утолщать и так очень толстое???
11. sazol 30.09.10 15:34 Сейчас в теме
(9) Я тебя не заставляю пользоваться моим примером реализации, хочешь пиши свой :) . У нас данная история не используется для всех документов и справочников, а для основных, где как раз такая детальная история и необходима. Работает данная история уже довольно долго и база не сдохла... :) и не сдохнет!
Я не заметил сильного "заторможения" работы при записи документов от обычной записи.
Я конечно понял что Вы имели ввиду что это не идеал и далеко это не так, ну я не кого не принуждаю его использовать, просто поделился, меня данный вариант устраивает. При томуж очень просто в кончоле отчетов накидать отчет по изменениям для руководства :-Р
13. w-divin 30.09.10 16:27 Сейчас в теме
(11) Один из смыслов оставлять комменты тут - это как раз указать автору на негативные стороны выставленного решения... а вы как-то неадекватно на конструктивную критику реагируете... по поводу "хочешь - пиши свой" - смотри пост (9) - там сказано что у меня уже написано и работают 3 различных механизма хранения истории изменений.

Заметьте - я не написал что обработка плохая или никому не нужная - я указал на минусы, которые присутствуют в её реализации, потому как тема актуальная еще со времен клюшек... И как всегда в механизмах регистрации изменений хочется задать вопрос (хотя ответ очевиден :D ): берем документ с 5000 строк, удаляем первую строку и имеем 5000 записей об изменении.... верно? или я что-то упустил?

ну и раз уже пошла такая тема, то оригинальностью данная разработка тоже не блещет (навскидку не говоря о платных вариантах):
http://infostart.ru/public/22167/
http://infostart.ru/public/19364/
http://infostart.ru/public/63420/
15. sazol 30.09.10 17:41 Сейчас в теме
(13) Конструктивная критика принята :)

берем документ с 5000 строк, удаляем первую строку и имеем 5000 записей об изменении.... верно? или я что-то упустил?


Почти угадал :)
Один элемент справочника "Изменение документов" и с табличной частью как минимум строк 4999, но и более, все зависит от количества реквизитов в ТЧ измененного документа и как они изменились по отношению к значениям которые хранились в записи на строку выше...)))
17. w-divin 30.09.10 18:36 Сейчас в теме
(15) хех...болезнь... у меня в механизме в xml реализован контроль удаления строк, но он тож далек от идеала и никак не помогает при изменении порядка строк ((( но хоть что-то... уже легше... ... а так хотелось....

в 13 я имел ввиду записи об изменениях - т.е. то что видит пользователь при анализе, а не количество записей в бд...
18. sazol 30.09.10 20:25 Сейчас в теме
(17) ну я же написал, пользователь видит одну строку с одним изменением документа пользователем. (Ну это является элементом справочника) Далее открывает этот элемент справочника и в шапке отображается кто, когда и какой документ/справочник изменил, а ниже табличная часть со строками изменения реквизитов. Вот в ней, табличной части справочника, уже много строк.(показывается в каждой строке реквизит далее значение до, значение после)
23. kasper076 88 15.10.10 08:50 Сейчас в теме
(17) Может стоит пренебречь изменением номера строки? Т.е. исключить этот реквизит из проверки ТЧ.
2. vit1c 29.09.10 17:07 Сейчас в теме
Zупер!!! Пользую. Нравится.
3. Чертеночек 29.09.10 17:37 Сейчас в теме
кому боян, а кому НРАВИТСЯ:)))):{}
4. PowerBoy 3228 30.09.10 09:20 Сейчас в теме
"Если НовЭлемент.Изменения.Количество() = 99999 Тогда"

я хренею от такого кода :o
6. w-divin 30.09.10 10:15 Сейчас в теме
ну йопт... ну зачем все в базу-то пихать???

и выполнение на клиенте - это не есть гуд... можно даже сказать есть бэд...

+(4) тоже понравилось... опять же на клиенте )))
5. Asdam 119 30.09.10 10:13 Сейчас в теме
НашиДороботки
Это от слова робот?
8. zzerro 277 30.09.10 15:08 Сейчас в теме
(7 )... Так как на сервер объект не передашь ...

Это вообще как понимать?
10. sazol 30.09.10 15:21 Сейчас в теме
(8) При попытки передачи объекта на сервер ругается на мутабельное значение!
12. cool.dkf 30.09.10 15:34 Сейчас в теме
(10) Все правильно - напрямую серверу передать такие значения нельзя. Где-то я уже видел что-то подобное, но все равно +
14. rumik007 30.09.10 17:17 Сейчас в теме
И в нужном документе/справочнике в модуле объекта вконце процедуры ПередЗаписью() размещаем следующее:




#Если Клиент Тогда

Если Не Отказ Тогда

НашиДороботки.ЗаписатьИзмененияДокументаВСправочникИзмененияДокументов(ЭтотОбъект);

КонецЕсли;

#КонецЕсли
Показать


:idea: Наверное лучше бы было оформить через подписку на событие.
s.w.a.t.; +1 Ответить
16. sazol 30.09.10 17:46 Сейчас в теме
(14) Идея хорошая... не подумал сразу, спасибо :)
19. Michael_Osipov 10 01.10.10 08:26 Сейчас в теме
Может быть и не идеал, но работает как надо. Для нескольких документов с небольшими изменениями как раз то, что нужно. Моя благодарность автору.
20. K_A_O 536 03.10.10 08:50 Сейчас в теме
Только за Найти(Объект.Метаданные().ПолноеИмя(), ".")-1) = "Документ" хочется минус поставить
21. Djekiss 10.10.10 12:07 Сейчас в теме
Клёво! Всё работает!! оргомное СПАСИБО АВТОРУ!!!!!!!!!!!! :{}
Давно не могла решить эту проблему: как же можно отслеживать кто, когда и что именно изменил в документе или справочнике!? Теперь буду знать кому именно по голове стучать :evil: !!!!) еще раз спасибо! :D
22. Djekiss 10.10.10 12:14 Сейчас в теме
Клёво! Всё работает!! ОГРОМНОЕ СПАСИБО АВТОРУ!!!!!
Давно не знала как решить эту проблему: как же отслеживать кто, когда и что именно изменил в документе или справочнике... Теперь буду знать кому надо по голове стучать!!!)))) Еще раз СПАСИБО! :{}
24. rhtr 88 16.10.10 07:41 Сейчас в теме
ПЛЮСУЮ, а на счет событий это уже каждый дадумает сам)
25. zhleonid8 18.10.11 17:03 Сейчас в теме
автору респекти призыв на 8,2
26. i132 122 06.03.12 12:44 Сейчас в теме
RTFM, инетерсно, почему вы используете запрос а не сравниваете реквизиты ссылки и объекта?

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

Сравнение табличных частей мне кажется быстрее сравнивать через ЗначениеВстркуВнутр( табЧасть.Выгрузить()) для каждой строки табчасти вызывать Объект.Метаданные() -должно заметно увеличивать время обработки записи.

Перед присвоением ГУИД-ссылки новому объекту стоит проверить была ли уже ему присвоена другая ссылка (ГУИД <> "00000000-0000-0000-0000-000000000000")

Для поиска справочника с изменениями может быть не достаточно одного ГУИД -надо еще искать и по виду - можно создать два справочника разных видов но с одним ГУИД (в вашем случае этого не будет вы каждый раз получаете новый ГУИД)
27. AlekseiLeit 9 09.04.12 09:50 Сейчас в теме
Спасибо автору. Пригодилось
28. WildDancer 3 22.06.12 06:48 Сейчас в теме
Просто и со вкусом, и главное отлично работает. Спасибо
29. WildDancer 3 22.06.12 07:23 Сейчас в теме
Немного поторопился. Конфликтует с моей доработкой)
30. kosb_64 22.06.12 16:42 Сейчас в теме
Уже ставил "+", только он пропал куда-то. Работает отлично. Ставлю ещё раз "+"!!
31. kudim 21.06.16 12:48 Сейчас в теме
А зачем записывать изменения в событии ПередЗаписью? а если в процессе проверки ПриЗаписи формы или Объекта получим отказ и не запишем? история то уже сохранится.
Логичнее тогда уж фиксировать записанные изменения после записи объекта.
32. Arkadag 28.11.17 15:32 Сейчас в теме
Понимаю, что запоздало. Установил данный код на Контрагентах и Договорах. После применения данного кода на РИБ, после обмена на филиальной базе все вновь созданные контрагенты остались без привязке к своим договорам. Т.е. договора то в базу перенеслись, но без владельца... В чем дело? почему так получилось?
Оставьте свое сообщение

См. также

Программные перечисления, ч.2: приемы кэширования при разработке Промо

Универсальные функции Механизмы платформы 1С Запросы Платформа 1С v8.3 Платформа 1С v8.3 Бесплатно (free) Бесплатно (free)

Все знают, что такое кэш, и зачем он нужен. Но в 1С разработчик обычно использует кэширование только на уровне конфигурации, а в какой-нибудь обработке скорее ломает голову над запросом - как получить все данные за один заход... Хочется рассказать о том, как можно добиться хороших результатов с стратегией "разделяй и властвуй".

30.10.2017    30735    unichkin    18    

Выполнение длительных операций в фоновых заданиях

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Бесплатно (free) Бесплатно (free)

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

19.01.2023    1257    programmer_2019    6    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Россия Россия Бесплатно (free) Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    59362    tormozit    53    

Выгрузка данных в Excel с добавлением формул (нюансы формирования формул)

Загрузка и выгрузка в Excel Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Бесплатно (free) Бесплатно (free)

Итак, я здесь описываю выгрузку отчета в Excel с добавлением пустых колонок для заполнения внутри самого Excel + колонки с формулами для выполнения расчетов на базе выгруженного и введенного руками в Excel. На самом деле публикация появилась по причине моих проблем, возникших при написании формул. Все остальное вроде штатно, но вдруг кому пригодится.

30.05.2022    2190    Zlohobbit    5    

Хитрости СКД. Часть 3

СКД Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Система компоновки данных Система компоновки данных Конфигурации 1cv8 Конфигурации 1cv8 Бесплатно (free) Бесплатно (free)

Столкнулся с тем, что мне приходится писать гору отчетов. Во многих приходится использовать повторяющиеся приемы. Решил написать шпаргалку, которая, надеюсь пригодится не только мне. В этой статье: Объединение ячеек в отчете только на определенном уровне иерархии, Постобработка итогов в табличном документе, Скрытие колонок в зависимости от количества месяцев в периоде.

28.05.2022    5914    milkers    11    

Базовые принципы работы с регламентными заданиями подсистем БСП

Универсальные функции БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Бесплатно (free) Бесплатно (free)

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

22.05.2022    6007    quazare    24    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Россия Россия Бесплатно (free) Бесплатно (free)

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

10.09.2017    56670    tormozit    79    

Модули общего назначения - готовые полезные функции и процедуры конфигураций на БСП

Универсальные функции БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Бесплатно (free) Бесплатно (free)

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

25.04.2022    8082    quazare    11    

Вывод табличных документов с разной ориентацией страниц в один pdf файл

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Россия Россия Бесплатно (free) Бесплатно (free)

Привожу код для вывода нескольких табличных документов c разной ориентацией страниц в один файл pdf.

06.04.2022    2185    sdjoker    5    

Полезный код для программистов 1С (часть 3). Подготовка печатных форм + подсистема Управление печатью (БСП)

БСП (Библиотека стандартных подсистем) Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Бесплатно (free) Бесплатно (free)

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

07.03.2022    7732    vandalsvq    0    

Универсальные функции с примерами использования Промо

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Бесплатно (free) Бесплатно (free)

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

26.02.2016    45357    unichkin    48    

Конвертируем печатную форму pdf в картинку (jpg, gif, png и прочие) на сервере

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Бесплатно (free) Бесплатно (free)

Была поставлена интересная задача конвертировать печатную форму в файл картинку. По условию задачи клиенту на почту нужно присылать только файл картинку (jpg, gif).

22.12.2021    5067    John_d    25    

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

Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Платформа 1С v8.3 Бесплатно (free) Бесплатно (free)

Простая и удобная среда разработки 1С:Предприятия позволяет практически любому человеку начать работать под капотом 1С - в конфигураторе. Время идет, новички становятся программистами, специалистами, а об удобных приемах работы узнают годами, по ходу своего карьерного пути. А здорово было бы, если бы все знали удобные приемы в начале своего пути? Эти несколько приемов будут полезны новичкам, так как они затрагивают ту область работы, с которой приходится сталкиваться в начале карьеры.

12.11.2021    11411    acces969    95    

Простейший способ учета изменений управляемых форм объектов 1С

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Бесплатно (free) Бесплатно (free)

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

02.11.2021    1870    avalakh    12    

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

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Бесплатно (free) Бесплатно (free)

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

01.11.2021    1627    avalakh    5    

Программно свернуть/развернуть узел динамического списка (с основной таблицей). Жирная точка над всеми "i".

Работа с интерфейсом Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Бесплатно (free) Бесплатно (free)

Какой пользователь не мечтал поменьше тыркать кнопкой? Особенно в малюсенькие +/- в "древесных" динамических списках. Если вас тоже озадачили, чтобы, при выборе узла дерева сами развернулись все его вложенные элементы , а при выборе другого узла - так же автоматом свернулась ранее развернутая ветка (причем эти узлы могут находится в разных "отношениях" друг с другом)... То вам - сюда.

08.10.2021    3306    e-9    13    

Ускорение отладки управляемых форм Промо

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Бесплатно (free) Бесплатно (free)

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

23.05.2015    15649    moolex    6    

УстановитьСсылкуНового() как ход оптимизации! Промо

Универсальные функции Механизмы типовых конфигураций Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Бесплатно (free) Бесплатно (free)

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

22.10.2014    62560    logarifm    85    

Своя функция &Вместо &ИзменениеИКонтроль

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Россия Россия Бесплатно (free) Бесплатно (free)

Как добавить контроль в расширения, если не доверяешь аннотации &ИзменениеИКонтроль.

06.06.2021    14134    AntonProgma    171    

Предотвращение многократного вызова "ПриПолученииДанных" во время поиска в табличном поле в обычных формах

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Бесплатно (free) Бесплатно (free)

Долго искал решение: как при выводе строк заполнить значениями колонки, которые созданы программно, чтобы, не было тормозов при стандартном поиске. И с минимальными изменениями (легко контролируемыми, при обновлении).

07.04.2021    3227    Vlad_CK    9    

[8.2] Глобальные переменные в контексте сервера (управляемое приложение) Промо

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Россия Россия Бесплатно (free) Бесплатно (free)

Можно ли в 8.2 на сервере хранить ссылку на объект внешней компоненты? Можно! Рассмотрим на примере... Эта статья - отчет на вопрос в http://infostart.ru/forum/forum14/topic29689/

09.12.2009    39379    Душелов    34    

Генератор QR кодов для 1С без компонент через HTTP API

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Бесплатно (free) Бесплатно (free)

Самый простой, на мой взгляд, способ получить QR код для 1СV8. Без внешних компонент, как говорится, бесплатно, без смс и регистрации))

17.12.2020    8353    shell_maxim    28    

Сохранение настроек

Универсальные функции БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Бесплатно (free) Бесплатно (free)

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

22.11.2020    8493    ixijixi    8    

Сохранение настроенного запроса набора данных СКД

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Система компоновки данных Система компоновки данных Конфигурации 1cv8 Конфигурации 1cv8 Бесплатно (free) Бесплатно (free)

Как сохранить запрос набора данных СКД в том виде, каким он будет выполнен системой для открытия в консоли запросов с диска ИТС.

09.11.2020    2244    Serge R    0    

Проверка заполненности реквизитов через подписку на событие Промо

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Бесплатно (free) Бесплатно (free)

Навеяло от...http://infostart.ru/public/203664/ но с другого бока. Пришли пингвины, заявили... (а база перекурочена предшественниками как черепаха богом) хотим чтоб если есть в документе такой то реквизит, чтоб он всегда был заполнен... или же никогда там не выбирались группы и перечислили наименования справочников при ссылке на которые не должно быть пустот. И что? Я рыжий сидеть дня два прсматривать каждый из почти двух сотен доков? Потому и уродились три подписки на события. Описание в тексте Выбор групп проверяется на событие ПередЗаписью а проверка реквизитов на событии ОбработкаПроверкиЗаполнения

16.10.2013    14731    ser6702    7    

Произвольные колонтитулы и повтор шапки таблицы в табличном документе (функция)

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Бесплатно (free) Бесплатно (free)

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

07.10.2020    11436    ellavs    6    

Лайфхаки для разработчиков 1С. Часть 1

Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Платформа 1С v8.3 Россия Россия Бесплатно (free) Бесплатно (free)

Собрали 20 лайфхаков, которые используют наши программисты при работе с 1С. Формы, контрагенты, СКД, процедуры, глюки платформы и многое другое. В этой статье публикуем первую часть.

30.09.2020    9116    Neti    47    

Самый простой парсинг и обработка веб-страниц в 1С

WEB-интеграция Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Бесплатно (free) Бесплатно (free)

Рассмотрим самый простой парсинг веб-страниц средствами платформы 1С и еще некоторые полезные приемы работы с веб-страницами.

07.08.2020    22433    Infostart    30    

Стандартные доработки. Запрет изменения документов “ЗаказовПокупателей”, по которым есть движения. Промо

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Россия Россия Бесплатно (free) Бесплатно (free)

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

07.04.2011    28354    milkers    25    

Полезные встроенные функции для работы с печатными формами и не только на УТ 11.4 и БП 3.0 (сравнение)

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление торговлей 11 Россия Россия Бесплатно (free) Бесплатно (free)

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

10.07.2020    13443    quazare    7    

Вывод дерева в табличный документ СКД

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Система компоновки данных Система компоновки данных Бесплатно (free) Бесплатно (free)

Вывод содержимого элемента формы "ДанныеФормыДерево" в табличный документ средствами СКД.

09.07.2020    6404    Yashazz    12    

Сканируем без сканера или MXL to JPG Промо

Внешние источники данных Универсальные функции Печатные формы Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Бесплатно (free) Бесплатно (free)

Хотите конвертировать документы в формат изображения менее чем за минуту, не имея сканера? Тогда эта статья для вас.

24.05.2012    35280    shakmaev    47    

Форма выбора (подбор) в управляемых формах

Универсальные функции Работа с интерфейсом Платформа 1С v8.3 Платформа 1С v8.3 Управляемые формы Управляемые формы Конфигурации 1cv8 Конфигурации 1cv8 Россия Россия Бесплатно (free) Бесплатно (free)

Разбор небольших примеров того, как правильно открывать форму выбора (подбора) в управляемых формах, не прибегая к модальным окнам.

08.05.2020    153396    user5300    37    

Получаем уровень группировки ячейки табличного документа

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Бесплатно (free) Бесплатно (free)

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

23.03.2020    7730    maxx    16    

Поблочная обработка таблицы. Обзор решений

Универсальные функции Запросы СКД Платформа 1С v8.3 Платформа 1С v8.3 Бесплатно (free) Бесплатно (free)

8 способов реализации повседневной актуальной задачи, готовый код

25.02.2020    3157    Yashazz    21    

Сравнение адресов: случай из практики

Математика и алгоритмы Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Россия Россия Бесплатно (free) Бесплатно (free)

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

04.01.2020    5013    AnatolPopov    7    

Сходство Джаро - Винклера. Нечеткое сравнение строк

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Россия Россия Бесплатно (free) Бесплатно (free)

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

25.12.2019    10669    brooho    21    

Автоматическое создание связанного объекта в базе 1С: Документооборот через бесшовную интеграцию

Универсальные функции Механизмы типовых конфигураций Платформа 1С v8.3 Платформа 1С v8.3 1С:Документооборот 1С:Документооборот 1С:ERP Управление предприятием 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Зарплата и Управление Персоналом 3.x Бесплатно (free) Бесплатно (free)

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

23.12.2019    5723    pavelpribytkin96    2    

Разбор любого JSON-объекта в соответствующую структуру

Универсальные функции Платформа 1С v8.3 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv8 Бесплатно (free) Бесплатно (free)

Данная публикация предназначена разработчикам 1С, которым приходиться разбирать данные формата JSON. Выложенный пример кода создает объект типа Структура, полностью повторяющий структуру данных формата JSON.

13.11.2019    33154    user665435_al.windstorm    16