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

Публикация № 201643

Администрирование - Администрирование данных 1С - Обработка документов

автозаполнение реквизитов

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

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

Ниже предлагается вариант реализации механизма автозаполнения реквизитов документов по заданным условиям.

 

1. Создаем подписку на событие "ПередЗаписьюДокумента_АвтозаполнениеРеквизитов". Источник - "ДокументОбъект", событие - "Перед записью", обработчик "ОбщегоНазначения.ПередЗаписьюДокумента_АвтозаполнениеРеквизитов"

2. Текст процедуры общего модуля "ПередЗаписьюДокумента_АвтозаполнениеРеквизитов" и вспомогательных процедур:

 

Процедура ПередЗаписьюДокумента_АвтозаполнениеРеквизитов(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

ИмяДокумента = Источник.Метаданные().Имя;
ТипДокумента = Источник.Метаданные().Синоним;
Если Источник.Метаданные().Реквизиты.Найти("ВидОперации") <> Неопределено Тогда
ВидОперации = Строка(Источник.ВидОперации);
Иначе
ВидОперации = "";
КонецЕсли;

// предварительная проверка наличия настроек автозамены для данного типа документа и вида операции
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТипДокумента",ТипДокумента);
Запрос.УстановитьПараметр("ВидОперации",ВидОперации);

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

Если Выборка.Количество() = 0 Тогда
Возврат;
КонецЕсли;

// окончательная проверка наличия настроек автозамены для данного типа документа и вида операции
ПараметрыАвтозаполнения = Неопределено;

Пока Выборка.Следующий() Цикл
УсловияВыполнены = Истина;
УсловияАвтозаполнения = Выборка.Ссылка.Условия;

Для каждого стр из УсловияАвтозаполнения Цикл
Если Источник[ПолучитьИмяРеквизитаПоСинониму(,стр.Реквизит,ИмяДокумента)] <> стр.Значение Тогда
УсловияВыполнены = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;

Если УсловияВыполнены Тогда
ПараметрыАвтозаполнения = Выборка.Ссылка.Настройки;
Прервать;
КонецЕсли;
КонецЦикла;

Если Не ЗначениеЗаполнено(ПараметрыАвтозаполнения) Тогда
Возврат;
КонецЕсли;

ПредставлениеДокумента = ТипДокумента+" № "+Источник.Номер+" от "+Формат(Источник.Дата,"ДФ=dd.MM.yyyy");

Для каждого стр из ПараметрыАвтозаполнения Цикл
Если Не ЗначениеЗаполнено(стр.ТабличнаяЧасть) Тогда
// заполняем значения реквизита в шапке документа
ИмяРеквизита = ПолучитьИмяРеквизитаПоСинониму(,стр.Реквизит,ИмяДокумента);
Если стр.Принудительно или Не ЗначениеЗаполнено(Источник[ИмяРеквизита]) Тогда
Сообщить(" "+ПредставлениеДокумента+": выполнено "+?(ЗначениеЗаполнено(Источник[ИмяРеквизита]),"изменение","автозаполнение")+" реквизита """+стр.Реквизит+"""");
Источник[ИмяРеквизита] = стр.Значение;
КонецЕсли;
Иначе
// заполняем значения реквизита в табличной части
ИмяТабличнойЧасти = ПолучитьИмяОбъектаПоСинониму("ТабличнаяЧасть",стр.ТабличнаяЧасть,ИмяДокумента);
ИмяРеквизита = ПолучитьИмяРеквизитаПоСинониму(ИмяТабличнойЧасти,стр.Реквизит,ИмяДокумента);
Для каждого стрТЧ из Источник[ИмяТабличнойЧасти] Цикл
Если стр.Принудительно или Не ЗначениеЗаполнено(стрТЧ[ИмяРеквизита]) Тогда
Сообщить(" "+ПредставлениеДокумента+": выполнено "+?(ЗначениеЗаполнено(стрТЧ[ИмяРеквизита]),"изменение","автозаполнение")+" реквизита """+стр.Реквизит+""" табличной части """+стр.ТабличнаяЧасть+"""");
стрТЧ[ИмяРеквизита] = стр.Значение;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;

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



Функция ПолучитьИмяРеквизитаПоСинониму(ИмяТабличнойЧасти="",СинонимОбъекта,ИмяДокумента) Экспорт

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

КонецФункции

 

3. Создаем справочник "Параметры автозаполнения документов"

 

Типы значений реквизитов:

ТипДокумента - Строка(100)

ВидОперации - Строка(100)

Отключено - Булево

Реквизит - Строка(100)

Значение - ЛюбаяСсылка, Булево, Строка, Дата, Число

ТабличнаяЧасть - Строка(100)

Реквизит - Строка(100)

Значение - ЛюбаяСсылка, Булево, Строка, Дата, Число

Принудительно - Булево

 

Форма списка справочника:

 

Форма элемента справочника:

 

Модуль формы элемента справочника:

Перем ИмяДокумента;

Процедура ПриОткрытии()

ИмяДокумента = _ОбщегоНазначения.ПолучитьИмяОбъектаПоСинониму("Документ",ТипДокумента);
ЗаполнитьСписокТиповДокументов();

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

Процедура ТипДокументаПриИзменении(Элемент)

ВидОперации = "";
Условия.Очистить();
Настройки.Очистить();
ИмяДокумента = _ОбщегоНазначения.ПолучитьИмяОбъектаПоСинониму("Документ",ТипДокумента);

ЗаполнитьСписокВидовОперацийДокумента();

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

Процедура ВидОперацииНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)

Если ЭлементыФормы.ВидОперации.СписокВыбора.Количество() = 0 Тогда
ЗаполнитьСписокВидовОперацийДокумента();
КонецЕсли;

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


Процедура УсловияПередНачаломДобавления(Элемент, Отказ, Копирование)

Если Не ЗначениеЗаполнено(ИмяДокумента) Тогда
Отказ = Истина;
КонецЕсли;

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

Процедура НастройкиПередНачаломДобавления(Элемент, Отказ, Копирование)

Если Не ЗначениеЗаполнено(ИмяДокумента) Тогда
Отказ = Истина;
КонецЕсли;

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


Процедура НастройкиТабличнаяЧастьНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)

ЗаполнитьСписокТабличныхЧастейДокумента();

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



Процедура НастройкиТабличнаяЧастьПриИзменении(Элемент)

стр = ЭлементыФормы.Настройки.ТекущаяСтрока;
стр.Реквизит = "";
стр.Значение = "";

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


Процедура УсловияРеквизитНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)

ЗаполнитьСписокРеквизитовДокумента_Условия();

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



Процедура НастройкиРеквизитНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)

стр = ЭлементыФормы.Настройки.ТекущаяСтрока;
ЗаполнитьСписокРеквизитовДокумента_Настройки(_ОбщегоНазначения.ПолучитьИмяОбъектаПоСинониму("ТабличнаяЧасть",стр.ТабличнаяЧасть,ИмяДокумента));

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


Процедура УсловияРеквизитПриИзменении(Элемент)

стр = ЭлементыФормы.Условия.ТекущаяСтрока;
стр.Значение = "";

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



Процедура НастройкиРеквизитПриИзменении(Элемент)

стр = ЭлементыФормы.Настройки.ТекущаяСтрока;
стр.Значение = "";

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


Процедура УсловияПриАктивизацииЯчейки(Элемент)

Если Элемент.ТекущаяКолонка.Имя = "Значение" Тогда
стр = ЭлементыФормы.Условия.ТекущаяСтрока;
Если стр = Неопределено Тогда
Возврат;
КонецЕсли;

Если ЗначениеЗаполнено(стр.Реквизит) Тогда
ЗадатьТипЗначенияРеквизита_Условия(стр);
КонецЕсли;
КонецЕсли;

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



Процедура НастройкиПриАктивизацииЯчейки(Элемент)

Если Элемент.ТекущаяКолонка.Имя = "Значение" Тогда
стр = ЭлементыФормы.Настройки.ТекущаяСтрока;
Если стр = Неопределено Тогда
Возврат;
КонецЕсли;

Если ЗначениеЗаполнено(стр.Реквизит) Тогда
ЗадатьТипЗначенияРеквизита_Настройки(стр);
КонецЕсли;
КонецЕсли;

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


Процедура ПередЗаписью(Отказ)

// удаляем пустые строки табличной части УСЛОВИЯ
ном = Условия.Количество()-1;
Пока ном >= 0 Цикл
Если Не ЗначениеЗаполнено(Условия[ном].Реквизит) Тогда
Условия.Удалить(ном);
КонецЕсли;
ном = ном - 1;
КонецЦикла;

// сортируем строки табличной части УСЛОВИЯ
Условия.Сортировать("Реквизит");

// проверяем наличие дублей строк табличной части УСЛОВИЯ
табУсловия = Условия.Выгрузить();
табУсловия.Колонки.Добавить("Счетчик");
табУсловия.ЗаполнитьЗначения(1,"Счетчик");

табУсловия.Свернуть("Реквизит","Счетчик");

Для каждого стр из табУсловия Цикл
Если стр.Счетчик > 1 Тогда
Сообщить("Обнаружены дубли строк в табличной части ""Условия отбора"" !");
Отказ = Истина;
КонецЕсли;
КонецЦикла;

// удаляем пустые строки табличной части НАСТРОЙКИ
ном = Настройки.Количество()-1;
Пока ном >= 0 Цикл
Если Не ЗначениеЗаполнено(Настройки[ном].Реквизит) Тогда
Настройки.Удалить(ном);
КонецЕсли;
ном = ном - 1;
КонецЦикла;

// сортируем строки табличной части НАСТРОЙКИ
Настройки.Сортировать("ТабличнаяЧасть,Реквизит");

// проверяем наличие дублей строк табличной части НАСТРОЙКИ
табНастройки = Настройки.Выгрузить();
табНастройки.Колонки.Добавить("Счетчик");
табНастройки.ЗаполнитьЗначения(1,"Счетчик");

табНастройки.Свернуть("ТабличнаяЧасть,Реквизит","Счетчик");

Для каждого стр из табНастройки Цикл
Если стр.Счетчик > 1 Тогда
Сообщить("Обнаружены дубли строк в табличной части ""Настройки заполнения"" !");
Отказ = Истина;
КонецЕсли;
КонецЦикла;

Если Отказ Тогда
Возврат;
КонецЕсли;

// проверяем наличие дублей в справочнике
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТипДокумента",ТипДокумента);
Запрос.УстановитьПараметр("ВидОперации",ВидОперации);
Запрос.УстановитьПараметр("Ссылка",Ссылка);

Запрос.Текст = "ВЫБРАТЬ
| ПараметрыАвтозаполненияДокументов.Ссылка
|ИЗ
| Справочник.ПараметрыАвтозаполненияДокументов КАК ПараметрыАвтозаполненияДокументов
|ГДЕ
| ПараметрыАвтозаполненияДокументов.ТипДокумента = &ТипДокумента
| И ПараметрыАвтозаполненияДокументов.ВидОперации = &ВидОперации
| И ПараметрыАвтозаполненияДокументов.Ссылка <> &Ссылка";
Выборка = Запрос.Выполнить().Выбрать();

ЕстьСовпадения = Ложь;
Пока Выборка.Следующий() Цикл
УсловияОтбора = Выборка.Ссылка.Условия;

Если Условия.Количество() <> УсловияОтбора.Количество() Тогда
Продолжить;
Иначе
Если Условия.Количество() = 0 Тогда
ЕстьСовпадения = Истина;
КонецЕсли;
КонецЕсли;

Для ном = 0 по Условия.Количество()-1 Цикл
Если Условия[ном].Реквизит <> УсловияОтбора[ном].Реквизит или Условия[ном].Значение <> УсловияОтбора[ном].Значение Тогда
Прервать;
Иначе
ЕстьСовпадения = Истина;
КонецЕсли;
КонецЦикла;

Если ЕстьСовпадения Тогда
Сообщить("В справочнике ""Параметры автозаполнения документов"" уже есть настройки для данного типа документа и вида операции с аналогичными условиями отбора !");
Отказ = Истина;
Прервать;
КонецЕсли;
КонецЦикла;

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



Процедура ЗаполнитьСписокТиповДокументов()


СписокТиповДокументов = Новый СписокЗначений;

// заполним список доступных типов документов
Для каждого эл из Метаданные.Документы Цикл
СписокТиповДокументов.Добавить(эл.Синоним,эл.Синоним);
КонецЦикла;

ЭлементыФормы.ТипДокумента.СписокВыбора = СписокТиповДокументов;

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



Процедура ЗаполнитьСписокВидовОперацийДокумента()

СписокВидовОперацийДокумента = Новый СписокЗначений;

РеквизитВидОперации = Метаданные.Документы[ИмяДокумента].Реквизиты.Найти("ВидОперации");
Если РеквизитВидОперации <> Неопределено Тогда
Реквизит = РеквизитВидОперации.Тип.ПривестиЗначение();

// заполним список возможных видов операций документа
Для каждого эл из Реквизит.Метаданные().ЗначенияПеречисления Цикл
СписокВидовОперацийДокумента.Добавить(эл.Синоним,эл.Синоним);
КонецЦикла;
КонецЕсли;

ЭлементыФормы.ВидОперации.СписокВыбора = СписокВидовОперацийДокумента;

Если СписокВидовОперацийДокумента.Количество() > 0 Тогда
ЭлементыФормы.НадписьВидОперации.Доступность = Истина;
ЭлементыФормы.ВидОперации.Доступность = Истина;
Иначе
ВидОперации = "";
ЭлементыФормы.НадписьВидОперации.Доступность = Ложь;
ЭлементыФормы.ВидОперации.Доступность = Ложь;
КонецЕсли;

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


Процедура ЗаполнитьСписокТабличныхЧастейДокумента()

СписокТабличныхЧастейДокумента = Новый СписокЗначений;

Для каждого тч из Метаданные.Документы[ИмяДокумента].ТабличныеЧасти Цикл
СписокТабличныхЧастейДокумента.Добавить(тч.Синоним,тч.Синоним);
КонецЦикла;

ЭлементыФормы.Настройки.Колонки.ТабличнаяЧасть.ЭлементУправления.СписокВыбора = СписокТабличныхЧастейДокумента;

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


Процедура ЗаполнитьСписокРеквизитовДокумента_Условия()

РеквизитВидОперации = Метаданные.Документы[ИмяДокумента].Реквизиты.Найти("ВидОперации");
СписокРеквизитовДокумента = Новый СписокЗначений;

Для каждого эл из Метаданные.Документы[ИмяДокумента].Реквизиты Цикл
Если эл = РеквизитВидОперации Тогда
Продолжить;
КонецЕсли;
СписокРеквизитовДокумента.Добавить(эл.Синоним,эл.Синоним);
КонецЦикла;

ЭлементыФормы.Условия.Колонки.Реквизит.ЭлементУправления.СписокВыбора = СписокРеквизитовДокумента;

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



Процедура ЗаполнитьСписокРеквизитовДокумента_Настройки(ИмяТабличнойЧасти)

РеквизитВидОперации = Метаданные.Документы[ИмяДокумента].Реквизиты.Найти("ВидОперации");
СписокРеквизитовДокумента = Новый СписокЗначений;

Если Не ЗначениеЗаполнено(ИмяТабличнойЧасти) Тогда
Для каждого эл из Метаданные.Документы[ИмяДокумента].Реквизиты Цикл
Если эл = РеквизитВидОперации Тогда
Продолжить;
КонецЕсли;
СписокРеквизитовДокумента.Добавить(эл.Синоним,эл.Синоним);
КонецЦикла;
Иначе
Для каждого эл из Метаданные.Документы[ИмяДокумента].ТабличныеЧасти[ИмяТабличнойЧасти].Реквизиты Цикл
СписокРеквизитовДокумента.Добавить(эл.Синоним,эл.Синоним);
КонецЦикла;
КонецЕсли;

ЭлементыФормы.Настройки.Колонки.Реквизит.ЭлементУправления.СписокВыбора = СписокРеквизитовДокумента;

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


Процедура ЗадатьТипЗначенияРеквизита_Условия(стр)

ИмяРеквизита = _ОбщегоНазначения.ПолучитьИмяРеквизитаПоСинониму(,стр.Реквизит,ИмяДокумента);
ТипРеквизита = _ОбщегоНазначения.ПолучитьТипРеквизитаПоИмени(,ИмяРеквизита,ИмяДокумента);

Если ТипЗнч(стр.Значение) <> ТипЗнч(ТипРеквизита.ПривестиЗначение()) Тогда
стр.Значение = ТипРеквизита.ПривестиЗначение();
ЭлементыФормы.Условия.Колонки.Значение.ЭлементУправления.ОграничениеТипа = ТипРеквизита;
ЭлементыФормы.Условия.Колонки.Значение.ЭлементУправления.Значение = ТипРеквизита.ПривестиЗначение();
КонецЕсли;

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



Процедура ЗадатьТипЗначенияРеквизита_Настройки(стр)

ИмяТабличнойЧасти = _ОбщегоНазначения.ПолучитьИмяОбъектаПоСинониму("ТабличнаяЧасть",стр.ТабличнаяЧасть,ИмяДокумента);
ИмяРеквизита = _ОбщегоНазначения.ПолучитьИмяРеквизитаПоСинониму(ИмяТабличнойЧасти,стр.Реквизит,ИмяДокумента);
ТипРеквизита = _ОбщегоНазначения.ПолучитьТипРеквизитаПоИмени(ИмяТабличнойЧасти,ИмяРеквизита,ИмяДокумента);

Если ТипЗнч(стр.Значение) <> ТипЗнч(ТипРеквизита.ПривестиЗначение()) Тогда
стр.Значение = ТипРеквизита.ПривестиЗначение();
ЭлементыФормы.Настройки.Колонки.Значение.ЭлементУправления.ОграничениеТипа = ТипРеквизита;
ЭлементыФормы.Настройки.Колонки.Значение.ЭлементУправления.Значение = ТипРеквизита.ПривестиЗначение();
КонецЕсли;

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

 

Как это работает

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

Замечания

1. Для табличной части реквизит заполняется одновременно для всех строк

2. Предполагается, что синонимы реквизитов объектов метаданных - уникальны в пределах этого объекта

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Поручик 4471 23.09.13 16:18 Сейчас в теме
(0) Лучше сделайте в виде отдельной подсистемы и продавайте за деньги.
2. vdscom 21 23.09.13 16:34 Сейчас в теме
(1) Поручик,
спасибо, подумаю :)
возможно, объединю с другими механизмами, пока не опубликованными на сайте
3. awk 725 23.09.13 18:23 Сейчас в теме
(1) Поручик, Кто это купит?

1. Ошибки проектирования:

Ошибка №1. Поиск по синониму. Если делать, так делать по полному имени Метаданные().ПолноеИмя();
Ошибка №2. Работа при записи, а не перед записью.
Ошибка (сильно субъективная) №3. Использование справочника. По моему гораздо лучше подойдет объект регистр сведений. Тем более там контроль уникальности по измерениям и периодичность.

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


2. Способы применения? Почему нельзя использовать Перед записью в объекте или подписке на событие? Что мешает работать в конфигураторе?

3. Безопасность. Где гарантия, что сторонняя установка не понаставит того, чего не надо?
i.kovtun; +1 Ответить
4. vdscom 21 23.09.13 18:43 Сейчас в теме
(3) awk,
я не считаю это ошибками

1. поиск по синониму делал сознательно, в конце статьи указал, что синонимы в пределах объекта метаданных должны быть уникальны
2. чем вам не нравится событие "ПриЗаписи" ?
3. а мне справочник больше нравится. интуитивнее, что ли. контроль уникальности реализован программно
4. насчет конфигуратора не совсем понял вашу мысль. у нас настройки автозамены выполняют сами бухгалтера, кому как нужно
5. не понаставит. если не поставить галочку "принудительно", то заполняются только незаполненные значения
5. awk 725 23.09.13 19:13 Сейчас в теме
(4) vdscom,
1. Считаешь ты поиск по синониму ошибкой или нет. Пишешь или нет, что он должен быть уникальным. Это остается ошибкой. То есть действием нарушающим правило. А правило гласит: "Идентификатор должен быть уникальным". Второе правило гласит: "Если что-то может пойти не так и ты об этом знаешь, то оно обязательно пойдет не так".
2. Тем что При записи выполняется после записи объекта в БД, но до окончания транзакции. Это серьезная ошибка.
3. А я и написал, что субъективно. То есть спорно и не факт, что правильно.
4. Что-то неправильное в этом. Если одному надо одно, другому - другое, то вроде реализовано это пользовательскими настройками, зачем огород городить?
5. А если оно должно оставаться пустым?
GlazunovAG; +1 Ответить
6. vdscom 21 23.09.13 20:34 Сейчас в теме
(5) awk,
1. вся жизнь у нас построена на допущениях. в контексте поставленной передо мной задачи поиск по синонимам меня вполне устраивает. считаете вы это ошибкой или нет. появится необходимость - переделаю, а пока - есть такое выражение - "Лучшее враг хорошего".
2. насчет "ПриЗаписи" - почти согласен
3. тут мы поняли друг друга
4,5. пользовательскими настройками реализовано далеко не все, а только заполнение некоторых стандартных параметров, типа ОсновнаяОрганизация или Ответственный. предложенный механизм - универсальный, заполняй любой параметр любым значением, в зависимости от заданных условий. "а если оно должно оставаться пустым" - ну так не создавайте для этого реквизита правило или наоборот, создайте правило, при определенных условиях записывающее в этот реквизит пустое значение. а если совсем уж везде враги народа мерещатся - настройте права доступа к этому справочнику
7. awk 725 23.09.13 23:38 Сейчас в теме
1. Зачем делать допущение, что два плюс два равно пять? Всем известно, что два плюс два равно четыре. Так и тут. Зачем делать допущение что синоним неизменен и уникален? Есть имя - оно хоть и изменяемо, но уникально в пределах типа. А полное имя уникально в пределах конфигурации.
2. Что означает почти? Что событие при записи возникает до помещения в базу данных? Или что оно происходит вне транзакции? Или что на ИТС нет рекомендаций? :D
3...
45. Ну хорошо. Допустим. Но посмотреть реализацию на всякий случай можно было? Там реализовано автозаполнение форм при открытии. Почему? Да потому, что пользователь перед записью видит что делает и может повлиять на записываемый реквизит. А если при записи это делать, то может получится следующее:

* Открываем выписку по кредиту
* Смотрим и видим, что в ней сумма нашего долга равна нулю
* Закрываем с записью

И о чудо мы должны 100 тысяч рублей.

А как должно бы было быть:

* Открываем выписку по кредиту
* Смотрим и видим, что в ней сумма нашего долга равна нулю
* Закрываем с записью

И видим сообщение, что надо либо указать сумму кредита, либо закрыть без сохранения.
ikekoval; teflon; Makushimo; baton_pk; the1; +5 Ответить
8. vdscom 21 24.09.13 13:00 Сейчас в теме
(7) awk,
1. еще раз повторюсь, я сознательно сделал это допущение. в контексте моей задачи меня это вполне устраивает. абсолютно и полностью.
2. посмотрел в конфигураторе рабочих баз - в подписке на событие задан обработчик "ПередЗаписью". получается, что в моей статье опечатка и мы спорили ни о чем :)
4,5. опять же, я делаю допущение, что пользователи, когда настраивают параметры автозамены, понимают, что и с какой целью они делают. то есть, в этом вопросе я пользователям доверяю. всесторонней защиты от дурака не было цели создавать. заполнение документа при открытии не устраивает по той простой причине, что для этого нужно дорабатывать каждый документ, пусть и всего одной строчкой кода.

надеюсь, мы друг друга услышали
9. awk 725 24.09.13 14:06 Сейчас в теме
10. burlakov 87 24.09.13 16:43 Сейчас в теме
не сочтите за рекламу, но моя разработка в чем-то лучше вашей. посмотрите сами http://infostart.ru/public/197108/

единственное неудобство, что надо втыкать код в сами модули, но подписки приоткрытии и присоздании пока к сожалению не придумали. на счет продавать вряд ли получится - моя бесплатна :)
11. vdscom 21 24.09.13 17:00 Сейчас в теме
(10) burlakov,
ну, мне моя больше нравится :)
и денег за нее я тоже не прошу
12. Эсти 6 19.08.14 11:25 Сейчас в теме
13. user730384 19.04.17 11:43 Сейчас в теме
спасибо большое за статью))
Оставьте свое сообщение

См. также

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions Промо

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

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    4416    comol    22    

Базовые вещи БСП, которые облегчат жизнь программисту 1С

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Россия Бесплатно (free)

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

30.08.2020    10954    quazare    33    

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

Практика программирования v8 v8::УФ 1cv8.cf Россия Бесплатно (free)

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

08.05.2020    35849    user5300    16    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    39308    ids79    26    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

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

10.12.2016    38457    unichkin    74    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

15.01.2020    30594    John_d    22    

Последовательности событий при проведении документа 1С. Шпаргалка + про формы + про расширения

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    23292    kuzyara    38    

30 задач. Странных и не очень

Практика программирования v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    18851    YPermitin    60    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    32069    tormozit    104    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    9853    Sibars    19    

Полезные процедуры и функции для программиста

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

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

07.10.2019    33204    HostHost    41    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    40274    Yashazz    50    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

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

20.09.2012    79315    tormozit    131    

О программе Postman для тестирования API и для чего она нужна 1С-нику

Практика программирования Программное обеспечение (software) v8 Бесплатно (free)

Для чего нужна программа Postman для тестирования API и какая от него польза для 1С-программиста.

24.09.2019    14612    budidich    28    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

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

06.09.2019    67417    rpgshnik    68    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    58356    ids79    55    

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

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

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

11.07.2007    50074    tormozit    48    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    33276    YPermitin    24    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    27069    YPermitin    80    

Отслеживание выполнения фонового задания

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

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    35309    ids79    16    

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

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

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

10.09.2017    46764    tormozit    74    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    107196    ids79    63    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

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

02.08.2019    44057    avalakh    26    

Разбираемся с параметрами редактирования СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Связь по типу, Параметры выбора, Связи параметров выбора

31.07.2019    29271    json    15    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    16426    m-rv    2    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    76168    ids79    14    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    39958    ids79    27    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    28374    YPermitin    14    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    20966    m-rv    17    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    20411    SeiOkami    50    

Работа с настройками системы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

02.07.2019    59396    ids79    17    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    60485    ids79    26    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    32325    m-rv    21    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    27037    dmurk    146    

Регистры накопления. Структура хранения в базе данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

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

16.05.2019    49748    YPermitin    30    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    37871    ellavs    126    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

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

05.12.2017    28852    itriot11    34    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    28633    ellavs    90    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    34521    YPermitin    53    

Ошибки при работе с хранилищем конфигурации и способы их решения

Практика программирования v8 Бесплатно (free)

В статье собраны наиболее распространенные ошибки при работе с хранилищем конфигурации и способы их обхода и решения.

01.03.2019    48617    Смешной 1С    31    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    78399    Serginio    113    

Разработка и сценарное тестирование с Vanessa-ADD. Отчетность Allure. Автоматизация запуска сценариев

Практика программирования Vanessa Automation v8 Россия Бесплатно (free)

Формируем отчетность о результатах выполнения сценариев. Автоматизируем запуск.

26.02.2019    24173    Vladimir Litvinenko    28    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    37415    ids79    40    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    46435    ids79    11    

EnterpriseData – часть 2. Процесс выгрузки данных

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    29004    ids79    31    

Тестер: частые вопросы Промо

Практика программирования v8 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    30141    grumagargler    31    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

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

14.12.2018    45803    ids79    75