"Прелести" БСП. Часть 1 - Дополнительные реквизиты / сведения

04.07.19

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

История небольшого расследования - сломались дополнительные реквизиты, или как НЕ НАДО использовать УИД в программном коде.

TLDR: Нашел в типовой интересный код. По-моему это грубая ошибка и нарушение стандартов. Подробности ниже.

Процедура ПриПолученииПредопределенныхНаборовСвойств(Наборы) Экспорт
	Набор = Наборы.Строки.Добавить();
	Набор.Имя = "Справочник_ВнешниеПользователи";
	Набор.Идентификатор = Новый УникальныйИдентификатор("d9c30d48-a72a-498a-9faa-c078bf652776");
	Набор.Используется  = ПолучитьФункциональнуюОпцию("ИспользоватьВнешнихПользователей");
	
	Набор = Наборы.Строки.Добавить();
	Набор.Имя = "Справочник_Пользователи";
	Набор.Идентификатор = Новый УникальныйИдентификатор("2bf06771-775a-406a-a5dc-45a10e98914f");
КонецПроцедуры

 

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

 

Но недавно, создавая клиенту (УТ 11.4.8.73) нового пользователя, я заметил, что вкладка "Дополнительные реквизиты" даже не появляется, хотя у списка пользователей их должно быть 5. Зайдя в существующих пользователей, я обнаружил, что у них вкладка присутствует, но там находятся только уже заполненные допреквизиты, причем они зачеркнуты и в режиме "Только чтение". Обычно подобные эффекты возникают, если дополнительный реквизит помечен на удаление, но в данном случае все было на месте.

 

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

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

Позволю себе прокомментировать не вполне очевидную конструкцию:

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

На первый взгляд может показаться, что разработчики 1С перемудрили и стоило написать намного проще:

УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);

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

 

В самой процедуре меня поджидал сюрприз:

Если Контекст.ОтложеннаяИнициализация Тогда

Судя по полному коду (не буду приводить его в статье, БСП доступно всем, можете взглянуть самостоятельно) подсистема дополнительных реквизитов поддерживает вариант работы, когда поля для реквизитов создаются в тот момент, когда пользователь открывает соответствующую вкладку (а не в момент открытия формы). И этот механизм использовался в справочнике "Пользователи". Сперва я подумал, что в механизме есть какая-то ошибка, но его отключение (с помощью переопределения процедуры в расширении) не исправило ошибку.

 

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

ВЫБРАТЬ
	НаборыСвойств.Набор КАК Набор,
	НаборыСвойств.ПорядокНабора КАК ПорядокНабора
ПОМЕСТИТЬ НаборыСвойств
ИЗ
	&НаборыСвойств КАК НаборыСвойств
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	НаборыСвойств.Набор КАК Набор,
	НаборыСвойств.ПорядокНабора КАК ПорядокНабора,
	СвойстваНаборов.Свойство КАК Свойство,
	СвойстваНаборов.ПометкаУдаления КАК ПометкаУдаления,
	СвойстваНаборов.НомерСтроки КАК ПорядокСвойства
ПОМЕСТИТЬ СвойстваНаборов
ИЗ
	НаборыСвойств КАК НаборыСвойств
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК СвойстваНаборов
		ПО (СвойстваНаборов.Ссылка = НаборыСвойств.Набор)
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства
		ПО (СвойстваНаборов.Свойство = Свойства.Ссылка)
ГДЕ
	НЕ СвойстваНаборов.ПометкаУдаления
	И НЕ Свойства.ПометкаУдаления
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	Свойства.Ссылка КАК Свойство
ПОМЕСТИТЬ ЗаполненныеСвойства
ИЗ
	ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства
ГДЕ
	Свойства.Ссылка В(&Свойства)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	СвойстваНаборов.Набор КАК Набор,
	СвойстваНаборов.ПорядокНабора КАК ПорядокНабора,
	СвойстваНаборов.Свойство КАК Свойство,
	СвойстваНаборов.ПорядокСвойства КАК ПорядокСвойства,
	СвойстваНаборов.ПометкаУдаления КАК Удалено
ПОМЕСТИТЬ ВсеСвойства
ИЗ
	СвойстваНаборов КАК СвойстваНаборов

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ЗНАЧЕНИЕ(Справочник.НаборыДополнительныхРеквизитовИСведений.ПустаяСсылка),
	0,
	ЗаполненныеСвойства.Свойство,
	0,
	ИСТИНА
ИЗ
	ЗаполненныеСвойства КАК ЗаполненныеСвойства
		ЛЕВОЕ СОЕДИНЕНИЕ СвойстваНаборов КАК СвойстваНаборов
		ПО ЗаполненныеСвойства.Свойство = СвойстваНаборов.Свойство
ГДЕ
	СвойстваНаборов.Свойство ЕСТЬ NULL
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ВсеСвойства.Набор КАК Набор,
	ВсеСвойства.Свойство КАК Свойство,
	ДополнительныеРеквизитыИСведения.ВладелецДополнительныхЗначений КАК ВладелецДополнительныхЗначений,
	ДополнительныеРеквизитыИСведения.ЗаполнятьОбязательно КАК ЗаполнятьОбязательно,
	ВЫБОР
		КОГДА &ЭтоОсновнойЯзык
			ТОГДА ДополнительныеРеквизитыИСведения.Заголовок
		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(СвойстваПредставления.Заголовок, ДополнительныеРеквизитыИСведения.Заголовок) КАК СТРОКА(150))
	КОНЕЦ КАК Наименование,
	ДополнительныеРеквизитыИСведения.ТипЗначения КАК ТипЗначения,
	ДополнительныеРеквизитыИСведения.ФорматСвойства КАК ФорматСвойства,
	ДополнительныеРеквизитыИСведения.МногострочноеПолеВвода КАК МногострочноеПолеВвода,
	ВсеСвойства.Удалено КАК Удалено,
	ДополнительныеРеквизитыИСведения.Доступен КАК Доступен,
	ДополнительныеРеквизитыИСведения.Виден КАК Виден,
	ВЫБОР
		КОГДА &ЭтоОсновнойЯзык
			ТОГДА ДополнительныеРеквизитыИСведения.Подсказка
		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(СвойстваПредставления.Подсказка, ДополнительныеРеквизитыИСведения.Подсказка) КАК СТРОКА(150))
	КОНЕЦ КАК Подсказка,
	ДополнительныеРеквизитыИСведения.ВыводитьВВидеГиперссылки КАК ВыводитьВВидеГиперссылки,
	ДополнительныеРеквизитыИСведения.ЗависимостиДополнительныхРеквизитов.(
		ЗависимоеСвойство КАК ЗависимоеСвойство,
		Реквизит КАК Реквизит,
		Условие КАК Условие,
		Значение КАК Значение
	) КАК ЗависимостиДополнительныхРеквизитов
ИЗ
	ВсеСвойства КАК ВсеСвойства
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
		ПО ВсеСвойства.Свойство = ДополнительныеРеквизитыИСведения.Ссылка
		ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Представления КАК СвойстваПредставления
		ПО (СвойстваПредставления.Ссылка = ДополнительныеРеквизитыИСведения.Ссылка)
			И (СвойстваПредставления.КодЯзыка = &КодЯзыка)

УПОРЯДОЧИТЬ ПО
	Удалено,
	ВсеСвойства.ПорядокНабора,
	ВсеСвойства.ПорядокСвойства

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

 

Создалось впечатление, что каким-то образом появился дубль, и система находит не тот элемент. Недолго думая, я решил попробовать удалить НЕ предопределенный элемент "Пользователи". Но удалить не получилось (ошибка, как выяснилось, была не только с пользователями):

 

Я склонен воспринимать это сообщение как баг системы. Я четко вижу, что удаляю НЕ ПРЕДОПРЕДЕЛЕННЫЙ элемент, но система пытается убедить меня в обратном. У неё не получилось - я отловил место, в котором возникает это сообщение, и переопределил его в расширении на что-то пустое. После этого "предопределенный элемент" удалился.

 

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

Процедура ПриПолученииПредопределенныхНаборовСвойств(Наборы) Экспорт
	Набор = Наборы.Строки.Добавить();
	Набор.Имя = "Справочник_ВнешниеПользователи";
	Набор.Идентификатор = Новый УникальныйИдентификатор("d9c30d48-a72a-498a-9faa-c078bf652776");
	Набор.Используется  = ПолучитьФункциональнуюОпцию("ИспользоватьВнешнихПользователей");
	
	Набор = Наборы.Строки.Добавить();
	Набор.Имя = "Справочник_Пользователи";
	Набор.Идентификатор = Новый УникальныйИдентификатор("2bf06771-775a-406a-a5dc-45a10e98914f");
КонецПроцедуры

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

1. Есть механизм предопределенных элементов, который, казалось бы, ПРЕДНАЗНАЧЕН для того чтобы не делать таких вещей.

2. Ломается обработка удаления - она не видит этой "неявной ссылки" на объект.

3. Ломается визуальный интерфейс предопределенных элементов.

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

&Вместо("ПриПолученииПредопределенныхНаборовСвойств")
Процедура А1_ПриПолученииПредопределенныхНаборовСвойств(Наборы)
	Набор = Наборы.Строки.Добавить();
	Набор.Имя = "Справочник_ВнешниеПользователи";
	//Набор.Идентификатор = Новый УникальныйИдентификатор("d9c30d48-a72a-498a-9faa-c078bf652776");
	Набор.Идентификатор = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_ВнешниеПользователи.УникальныйИдентификатор();
	Набор.Используется  = ПолучитьФункциональнуюОпцию("ИспользоватьВнешнихПользователей");
	
	Набор = Наборы.Строки.Добавить();
	Набор.Имя = "Справочник_Пользователи";
	//Набор.Идентификатор = Новый УникальныйИдентификатор("2bf06771-775a-406a-a5dc-45a10e98914f");
	Набор.Идентификатор = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Пользователи.УникальныйИдентификатор();
КонецПроцедуры

На этом история заканчивается - после исправления формы открываются и дополнительные реквизиты показываются. Ждем следующих интересных решений от фирмы "1С".

БСП Дополнительные реквизиты

См. также

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

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

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

29400 руб.

29.06.2023    4453    9    4    

18

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

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

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

7200 руб.

02.08.2023    2956    4    0    

19

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

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

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

01.03.2024    1282    dimanich70    6    

13

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

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

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

1 стартмани

27.10.2023    1995    13    avmartynov    10    

43

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

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

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

2 стартмани

22.08.2023    2071    21    progmaster    7    

3
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. riposte 384 04.07.19 15:44 Сейчас в теме
Может ТиУ исправило бы ситуацию? Пробовали?
Просмотрел сейчас две конфигурации на наличие функции ПриПолученииПредопределенныхНаборовСвойств - ничего нет. Обе используют БСП разной степени свежести. Скорее всего это является следствием или чей-то доработки, или спецификой конкретно этой конфигурации.
3. Enigma 308 04.07.19 16:31 Сейчас в теме
(1) , (2) - БСП 3.0.2.300. Конфигурация практически типовая (УТ), БСП определенно никто не трогал. По поводу сломается - благодарю за информацию, надо будет аккуратно проверить все при обновлении. В любом случае, предопределенные элементы добавлены в расширение, обновить "забыв" про них не получится.

Но вообще - кто-нибудь может объяснить, зачем 1С-ники пихают УИДы в код конфигурации?
tuprikov; RustIG; +2 Ответить
4. riposte 384 04.07.19 16:42 Сейчас в теме
(3)
Сложно сказать. Скорее всего, попало в обновление по запарке.
Тут как бы никто не спорит, что это чьи-то левые гуиды прилетели и таких объектов в базе не будет.
В чем был сакральный смысл добавлять их так, учитывая, что это все предопределенные элементы - останется тайной.
Иногда тоже уже на износе пишешь какой-то код и откровенно засыпаешь. Потом просыпаешься, читаешь что написал и волосы дыбом встают.
2. SlavaKron 04.07.19 16:23 Сейчас в теме
Проверил в БСП 3.0.3.17.
Процедура ПриПолученииПредопределенныхНаборовСвойств есть в том виде, как у автора.
А вот предопределенные элементы:
Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_ВнешниеПользователи
Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Пользователи.УникальныйИдентификатор
отсутствуют. Есть УдалитьСправочник_ВнешниеПользователи и УдалитьСправочник_Пользователи.
Автор, уточните какая версия БСП у вас, потому что ваше исправление поломается на версии 3.0.3.
5. Erne100 286 05.07.19 07:56 Сейчас в теме
Но недавно, создавая клиенту (УТ 11.4.9.73) нового пользователя
Опечатка с не вышедшим релизом отвлекала меня от смысла статьи... Может Вы имели в виду релиз 11.4.8.73? ...содержание +
7. Enigma 308 05.07.19 09:46 Сейчас в теме
(5) Действительно опечатка. Поправлю.
6. dhurricane 05.07.19 08:45 Сейчас в теме
Есть подозрение, что некорректно была обновлена конфигурация УТ. Да, действительно в свежих версиях БСП разраотчики перешли от "предопределенных в объекте" к "предопределенным в коде". Чтобы этот переход был корректным и не задублировал уже существующие элементы справочников, был реализован механизм подмены старых предопределенных на новые во время выполнения обработчиков обновления. Сопоставляются они по имени предопределенного. При этом очень важно, чтобы имена предопределенных в конфигурации получили префикс "Удалить". Судя по приведенному Вами коду, этого не случилось, у Вас имена предопределенных старые: "Справочник_ВнешниеПользователи" и "Справочник_Пользователи".

Это к вопросу, как могло все поломаться.

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

Но все это мои догадки, к сожалению ничем не подкрепленные.
Alex_E; serg_gres; CSiER; A_Max; acanta; +5 Ответить
12. qwinter 671 05.07.19 18:17 Сейчас в теме
(6)
Что касается вопроса, зачем разработчики БСП все это затеяли, то к моему сожалению, никакой информацией я не располагаю.
Это уже не секрет. 1С своим разработчикам платит за количество кода, вот некоторые редиски и плодят такой код ради кода. Меня на днях вывело из себя появление в ЗУПе в регистре "Данные для подбора сотрудников" второго измерения "Наименование" (ранее было одно "Сотрудник") которое используется в одном единственном месте, в списке сотрудников где по нему идет соединение с наименованием сотрудника. В итоге пользователи получили тормоза и исчезнувших из списка сотрудников, а программисты лишний геморрой.
d4rkmesa; RustIG; +2 Ответить
8. Dmitryiv 161 05.07.19 10:17 Сейчас в теме
О сколько нам открытий чудных
Готовят просвещенья дух
И Опыт, сын ошибок трудных,
И Гений, парадоксов друг,
И Случай, бог изобретатель...

Пушкин А.С., 1829
fuser; sikuda; +2 Ответить
9. SlavaKron 05.07.19 11:41 Сейчас в теме
Покопался я в демо УТ 11.4.8.73. В общем зря вы удалили этот элемент. Он нужен был разработчикам и поэтому они поставили заглушку на его удаление. Да, в типовой должно быть 2 элемента справочника НаборыДополнительныхРеквизитовИСведений "Пользователи": один предопределённый, другой – нет. У непредопределённого УИД – "2bf06771-775a-406a-a5dc-45a10e98914f". И все доп. реквизиты работают именно с непредопределённым. Добавление доп. реквизитов в предопределенный набор "Пользователи" не имеет результата. Стало быть, у разработчиков на него были планы. Скорее всего, предопределенные будут удалены в следующих релизах.
Прикрепленные файлы:
d4rkmesa; IntellXeon; user774630; +3 Ответить
10. Enigma 308 05.07.19 11:50 Сейчас в теме
(9) Я потом понял, что возможно у меня были неправильно назначены наборы реквизитов (как это получилось - другой вопрос, обновление было штатным). Правда, я припоминаю, что вроде как я пытался это исправить, но это не дало результатов.

В любом случае, "предопределять" объект в коде и потом смущать администраторов считаю дурным тоном. Пока что у меня все работает, причем ИМО более правильно. Эту УТ обновляем не очень часто, поэтому вопрос откладывается.
11. jONES1979 05.07.19 16:42 Сейчас в теме
Cпасибо за пост!
Расследования - это самые интересные темы!
user1835472; RustIG; +2 Ответить
13. ellavs 1022 14.07.19 21:48 Сейчас в теме
Как раз прикручиваю в конфигурации механизм допреквизитов.
В ИТС по БСП (использую версию 3.0.3) так и написано:
7. В процедуре ПриПолученииПредопределенныхНаборовСвойств общего модуля УправлениеСвойствамиПереопределяемый описать предопределенную группу с именем Справочник_<ИмяОбъекта>, если объект – справочник; Документ_<ИмяОбъекта>, если объект – документ, и т. д. Например, для справочника Номенклатура создана предопределенная группа Справочник_Номенклатура:

Набор = Наборы.Строки.Добавить();
Набор.Имя = "Справочник_Номенклатура";
Набор.ЭтоГруппа = Истина;
Набор.Идентификатор = Новый УникальныйИдентификатор("c7cd91d8-6f8a-4d10-82bf-c6fba8475a98");


В демо базе БСП они используют этот же код.

В поисках того, какой же идентификатор мне нужно написать для своего документа, попалась эта публикация.
Решение, к сожалению, не подошло.
Так и не понятно, какой всё-таки идентификатор нужно использовать? Любой (т.е. придумать GUID самому) или какой-то конкретный?
Прикрепленные файлы:
14. ellavs 1022 15.07.19 13:27 Сейчас в теме
(13) упс, не тот скрин приложила (в этом ошибка, которую я потом исправила, но всё равно не работало).
В итоге еще и баг БСП нашла, который некорректно обрабатывал добавляемый предопределенный элемент в справочник Наборов, если это группа (т.е. задано Набор.ЭтоГруппа = Истина;), которая используется для случая, описанного в ИТС как "Особые случаи настройки наборов свойств. Настройка объектов с разными наборами свойств у разных групп объектов". Настроила всё в точности по инструкции, но элемент записывался в справочник наборов упорно не как группа, в итоге при попытке добавить дочерний элемент (из спец.справочника на базе которого формировались наборы реквизитов) выходила ошибка на строке в модуле БСП "УправлениеСвойствами" "НаборСвойствОбъект.Записать(); по причине: Значение поля "Входит в группу" должно быть группой".

Для исправления ищем Общий модуль БСП УправлениеСвойствамиСлужебный, процедура СоздатьНаборСвойств:
Заменяем строку:
Если СвойстваНабора.ДочерниеНаборы = Неопределено Или СвойстваНабора.ДочерниеНаборы.Количество() = 0 Тогда
НА
Если (СвойстваНабора.ДочерниеНаборы = Неопределено Или СвойстваНабора.ДочерниеНаборы.Количество() = 0) И Не СвойстваНабора.ЭтоГруппа Тогда

День убила на поиск этой ошибки.
korppinen; tuprikov; RustIG; yabesabs; +4 Ответить
32. yabesabs 06.04.21 13:01 Сейчас в теме
(14)
14. ellavs 806 15.07.19 13:27
(13) упс, не тот скрин приложила (в этом ошибка, которую я потом исправила, но всё равно не работало).
В итоге еще и баг БСП нашла, который некорректно обрабатывал добавляемый предопределенный элемент в справочник Наборов, если это группа (т.е. задано Набор.ЭтоГруппа = Истина;), которая используется для случая, описанного в ИТС как "Особые случаи настройки наборов свойств. Настройка объектов с разными наборами свойств у разных групп объектов". Настроила всё в точности по инструкции, но элемент записывался в справочник наборов упорно не как группа, в итоге при попытке добавить дочерний элемент (из спец.справочника на базе которого формировались наборы реквизитов) выходила ошибка на строке в модуле БСП "УправлениеСвойствами" "НаборСвойствОбъект.Записать(); по причине: Значение поля "Входит в группу" должно быть группой".

Для исправления ищем Общий модуль БСП УправлениеСвойствамиСлужебный, процедура СоздатьНаборСвойств:
Заменяем строку:
Если СвойстваНабора.ДочерниеНаборы = Неопределено Или СвойстваНабора.ДочерниеНаборы.Количество() = 0 Тогда
НА
Если (СвойстваНабора.ДочерниеНаборы = Неопределено Или СвойстваНабора.ДочерниеНаборы.Количество() = 0) И Не СвойстваНабора.ЭтоГруппа Тогда

День убила на поиск этой ошибки.



Спасибо вам огромное за этот комментарий! Мне олн очень помог!
15. dhurricane 15.07.19 13:43 Сейчас в теме
(13)
придумать GUID самому
Да, самому. Я обычно пользуюсь для этих целей различными онлайн-генераторами.
17. RustIG 1351 16.08.20 12:30 Сейчас в теме
18. dhurricane 17.08.20 13:20 Сейчас в теме
(17) О том, нужно ли придумывать GUID самому.

Вряд ли я ответил на Ваш вопрос. Можете раскрыть его?
19. RustIG 1351 17.08.20 13:38 Сейчас в теме
(15)
обычно пользуюсь для этих целей различными онлайн-генераторами

что за генераторы? примеры можете указать?
21. dhurricane 17.08.20 13:57 Сейчас в теме
23. RustIG 1351 17.08.20 14:38 Сейчас в теме
(21)
где гарантия , что созданный УИД с помощью вашего онлайн-генератора , не пересечется с УИДом , уже имеющимся в базе данных?
24. dhurricane 18.08.20 10:08 Сейчас в теме
(23) Ее нет. А есть гарантия, что код ниже даст действительно уникальный идентификатор?
УИД = Строка(Новый УникальныйИдентификатор);

Не думаю, что справочник наборов дополнительных реквизитов будет столь объемным, дабы переживать из-за результатов генератора. В конце концов выбросит платформа ошибку при обновлении ИБ, что в этом страшного? Сгенерируйте новый идентификатор и все.
d4rkmesa; +1 Ответить
25. RustIG 1351 18.08.20 14:02 Сейчас в теме
(24)
В конце концов выбросит платформа ошибку при обновлении ИБ, что в этом страшного?


печально слышать такое...


- разработчики типовых /отраслевых такое используют, базы разлетаются по всей стране.... кто их будет обновлять в далеком поселке пгт. Агинское?
обновление для БП 3.0, ЗУП 3.Х сейчас вообще пользователи запускают....
если конфигурация корректно отработает ошибку, то пож-та делайте, а если вылетит в критическую ошибку?

- разработчики своих баз могут использовать, если они постоянно на поддержке - при случае проблемы решат...
26. dhurricane 18.08.20 20:14 Сейчас в теме
(25) Извините, не понимаю, что здесь страшного. Ошибка будет выброшена при запуске обработчиков обновления. При чем тут вся страна, если ошибка будет обнаружена еще на этапе внутреннего тестирования. Неужели Вы считаете, что после внесения изменений в типовую/отраслевую конфигурацию, она ни разу не будет запущена?
d4rkmesa; +1 Ответить
27. RustIG 1351 19.08.20 06:46 Сейчас в теме
(26)
Извините, не понимаю, что здесь страшного.

Фирма 1С зарегистрировала ошибку 00-00221247 по данному факту, описанному в статье. Вот ссылка на закрытый форум https://partners.v8.1c.ru/forum/topic/1833581

Мнение по поводу тестирования у меня такое - если на этапе тестирования ошибок не случилось, то на этапе эксплуатации у других клиентов ошибка может случиться. Тестирование не исключает ошибок на этапе эксплуатации.
28. dhurricane 20.08.20 08:17 Сейчас в теме
(27) Не понимаю, как эта ошибка связана с предложенным мной генератором GUID-ов, который не дает гарантий уникальности результата? Мне казалось, мы исключительно про уникальность диалог ведем, а не спорим про реализацию механизма доп. свойств.
d4rkmesa; +1 Ответить
29. RustIG 1351 20.08.20 11:07 Сейчас в теме
(28) да, вы правы.
я привел пример, что после тестов случилась ошибка - вы же как-то легко относитесь к ошибкам - написали что тесты все делают....
тут диалог со смешанными темами - про гуид я вас понял - пока не знаю "плохо" это или "хорошо"
20. RustIG 1351 17.08.20 13:39 Сейчас в теме
(15) всю жизнь считал, что самому такие сущности ни к чему создавать - платформа сама создает в рамках одной базы нужный УИД - следит за уникальностью.
22. dhurricane 17.08.20 13:59 Сейчас в теме
(20) Так и есть. Видимо здесь нужен идентификатор, уникальный, но при том одинаковый в рамках нескольких баз / областей данных. Сама по себе платформа такого обеспечить не может.
16. RustIG 1351 16.08.20 12:19 Сейчас в теме
(0) интересно жизнь складывается, год назад я не увидел вашу статью, и не обратил бы даже внимания. А вот в этом году , решая задачу, наткнулся на подобный код в типовой БП 3.0, ужаснулся от этого, написал на форум https://forum.infostart.ru/forum9/topic245550/
31. kolodina240751 18.11.20 16:16 Сейчас в теме
(16)привет, тоже обалдела от напрямую прописанных гуидов в коде БСП. создается ощущение недоделанности кода. вроде простая штука, но так все сложно закручено. и у меня например никак не получается подключить сведения к новому справочнику. даже не созданному мною - а уже существующему.
(16)
korppinen; +1 Ответить
30. Vladimir45 90 09.10.20 12:18 Сейчас в теме
Опять таки ответ на появляющийся вопрос, "почему так?" есть в самой статье в самом начале.
Потому-что "Но на самом деле у более сложной записи есть преимущество - она будет компилироваться даже если в системе не будет..." предопределенного.
33. un2qum 6 20.07.21 11:58 Сейчас в теме
Скачал свежую БСП с итс тот же самый говно код на месте
34. opus70 73 10.11.21 20:29 Сейчас в теме
насколько я понимаю такие конструкции

Набор.Идентификатор = Новый УникальныйИдентификатор("d9c30d48-a72a-498a-9faa-c078bf652776");

1с использует для того чтобы соблюсти не которые формальности при всяких обменах
35. TanitLi 20.01.22 14:40 Сейчас в теме
Подскажите как контролировать уникальность использования дополнительного реквизита в справочнике Сотрудники. ЗУП 3.1
36. user1356549 29.04.22 13:05 Сейчас в теме
И ещё один нюанс в данной теме ...

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

В самом примитивном варианте "проблема" решается очисткой коллекции элементов условного оформления
НаборыСвойств.УсловноеОформление.Элементы.Очистить();

в начале процедуры ОформитьНаборыИСвойства().
user1021675; +1 Ответить
37. korppinen 69 14.03.23 00:08 Сейчас в теме
Люди.. привет. не удается прилепить доп реквизиты к справочнику НОменклатура.. без групп
что не так то?

сама форма четко по инструкции бсп..
но до нее еще дойти надо.. сам обьект не выходит в Наборы доп рекв и сведений

Добавил предопределенный УдалитьСправочник_Номенклатура

это добавил в ПриПолученииПредопределенныхНаборовСвойств(Наборы)
Набор = Наборы.Строки.Добавить();
Набор.Имя = "Справочник_Номенклатура";
Набор.Идентификатор = Новый УникальныйИдентификатор("3001280c-f6ec-4fa9-bc4a-5eee8f177b60");

фиг с ним с уидом

но вот тут
Для Каждого Набор Из ДеревоНаборов.Строки Цикл
СвойстваНабора = СвойстваНабора(НаборыСвойств, Набор);
Для Каждого ДочернийНабор Из Набор.Строки Цикл
СвойстваДочернегоНабора = СвойстваНабора(НаборыСвойств, ДочернийНабор, СвойстваНабора.Ссылка, Наименования);
СвойстваНабора.ДочерниеНаборы.Вставить(ДочернийНабор.Имя, СвойстваДочернегоНабора);
КонецЦикла;

СвойствоНабора.ССылка - <Объект не найден.. >

запарился, куда копать?
38. korppinen 69 14.03.23 18:38 Сейчас в теме
(37) Короч... я нашел ответ. надо сделать обязательно обновление инф базы. запустить с ключем /Обновл.. без этого никак (к инструкции не нашел этого) и имя предопределенноого элемента Просто Справочник_Номенклатура
Оставьте свое сообщение