Поиск в базе битых ссылок - "объект не найден" В статье
Битая ссылка, <Объект не найден>, Уникальный Идентификатор, GUID мы обсуждали как востановить битые ссылки!
А вот как найти в базе все битые ссылки, которые имеют вид типа "<Объект не найден> (137:8b270030482898d011daad3cc45fc830)"?
Для поиска этого была написана данная обработка:
Скачивать файлы может только зарегистрированный пользователь!
Для поиска: Выбираем объекты метаданных , которые хотим проверить, жмем кнопочку "Выполнить" и наблюдаем в таблице выходные данные. Откуда можем попасть в объекты-источники.
Для программиста:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
ИспользоватьОграничение = ЗначениеЗаполнено(ОграничениеТипов);
РезультатПоиска.Очистить();
Для Каждого ОбъектыМетаданных Из КоллекцияОбъектов Цикл
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Состояние(ОбъектМетаданных.ПолноеИмя());
ПроверитьОбъектНаБитыеСсылки(ОбъектМетаданных);
КонецЦикла;
КонецЦикла;
Для Каждого ОбъектыМетаданных Из КоллекцияРегистров Цикл
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Состояние(ОбъектМетаданных.ПолноеИмя());
ПроверитьРегистрНаБитыеСсылки(ОбъектМетаданных);
КонецЦикла;
КонецЦикла;
//Анализ последовательностей
//ПроверитьОбъектНаБитыеСсылки(Метаданные.Справочники.СотрудникиОрганизаций);
КонецПроцедуры
Процедура ВывестиДанные(ТекстЗапроса)
Запрос = Новый Запрос(ТекстЗапроса);
Попытка
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
ТЗ = РезультатЗапроса.Выгрузить();
Для Каждого Стр Из ТЗ Цикл
ОбработкаПрерыванияПользователя();
Строка = РезультатПоиска.Добавить();
ЗаполнитьЗначенияСвойств(Строка, Стр);
КонецЦикла;
КонецЕсли;
Исключение
Сообщить(ИнформацияОбОшибке().Описание + " " + ИнформацияОбОшибке().Причина);
КонецПопытки;
КонецПроцедуры
Процедура ПроверитьРегистрНаБитыеСсылки(ОбъектМетаданных)
ИмяТаблицы = ОбъектМетаданных.ПолноеИмя();
Если Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда
Если ОбъектМетаданных.РежимЗаписи = НезависимыйРежимЗаписи Тогда
//АнализСвойствРегистраСведений(ОбъектМетаданных, ОбъектМетаданных.Измерения, ИмяТаблицы);
//АнализСвойствРегистраСведений(ОбъектМетаданных, ОбъектМетаданных.Ресурсы, ИмяТаблицы);
//АнализСвойствРегистраСведений(ОбъектМетаданных, ОбъектМетаданных.Реквизиты, ИмяТаблицы);
Возврат;
КонецЕсли;
АнализСвойствРегистра(ОбъектМетаданных, ОбъектМетаданных.Реквизиты, ИмяТаблицы);
КонецЕсли;
АнализСвойствРегистра(ОбъектМетаданных, ОбъектМетаданных.Измерения, ИмяТаблицы);
АнализСвойствРегистра(ОбъектМетаданных, ОбъектМетаданных.Реквизиты, ИмяТаблицы);
АнализРегистратораРегистра(ОбъектМетаданных, ИмяТаблицы);
Если Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда
//Для рег. бухгалтерии анализ субконто
КонецЕсли;
Если Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) Тогда
//Для регистров расчета доп. анализ
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьОбъектНаБитыеСсылки(ОбъектМетаданных)
ИмяТаблицы = ОбъектМетаданных.ПолноеИмя();
АнализСвойствОбъекта(ОбъектМетаданных, ОбъектМетаданных.Реквизиты, ИмяТаблицы);
Для Каждого ТабЧасть Из ОбъектМетаданных.ТабличныеЧасти Цикл
Если ТабличныеЧастиИсключения.Найти(ТабЧасть.Имя) <> Неопределено Тогда
Продолжить;
КонецЕсли;
АнализСвойствОбъекта(ОбъектМетаданных, ТабЧасть.Реквизиты, ИмяТаблицы + "." + ТабЧасть.Имя)
КонецЦикла;
//проверка владельца у справочников
Если Метаданные.Справочники.Содержит(ОбъектМетаданных) И ОбъектМетаданных.Владельцы.Количество() > 0 Тогда
МассивВладельцев = Новый Массив;
Для Каждого Элемент Из ОбъектМетаданных.Владельцы Цикл
МассивВладельцев.Добавить(Элемент);
КонецЦикла;
//АнализСвойствВладельцаОбъекта(ОбъектМетаданных, МассивВладельцев, ИмяТаблицы);
КонецЕсли;
//Для задач поле исполнитель
//проверки в журналах
ОбработкаПрерыванияПользователя();
КонецПроцедуры
Процедура АнализСвойствОбъекта(ОбъектМетаданных, Свойства, ИмяТаблицы)
Для Каждого Реквизит Из Свойства Цикл
Если РеквизитыИсключения.Найти(Реквизит.Имя) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Для Каждого моТип Из Реквизит.Тип.Типы() Цикл
ТекстЗапроса = "";
МетаданныеТипа = Метаданные.НайтиПоТипу(моТип);
Если МетаданныеТипа <> Неопределено
И Не Метаданные.Перечисления.Содержит(МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу(МетаданныеТипа.ПолноеИмя()) Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
ДобавитьВЗапросОбъект(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, Реквизит.Имя, моТип);
КонецЕсли;
Если Не ПустаяСтрока(ТекстЗапроса) Тогда
ВывестиДанные(ТекстЗапроса);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура АнализСвойствРегистра(ОбъектМетаданных, Свойства, ИмяТаблицы)
Для Каждого Реквизит Из Свойства Цикл
Если РеквизитыИсключения.Найти(Реквизит.Имя) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Для Каждого моТип Из Реквизит.Тип.Типы() Цикл
ТекстЗапроса = "";
МетаданныеТипа = Метаданные.НайтиПоТипу(моТип);
Если МетаданныеТипа <> Неопределено
И Не Метаданные.Перечисления.Содержит(МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу(МетаданныеТипа.ПолноеИмя()) Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
ДобавитьВЗапросРегистр(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, Реквизит.Имя, моТип);
КонецЕсли;
Если Не ПустаяСтрока(ТекстЗапроса) Тогда
ВывестиДанные(ТекстЗапроса);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура АнализРегистратораРегистра(ОбъектМетаданных, ИмяТаблицы)
МассивРегистраторов = ПолучитьСписокРегистраторов(ОбъектМетаданных);
Для Каждого Регистратор Из МассивРегистраторов Цикл
Если РеквизитыИсключения.Найти("Регистратор") <> Неопределено Тогда
Продолжить;
КонецЕсли;
моТип = Регистратор;
ТекстЗапроса = "";
МетаданныеТипа = Метаданные.НайтиПоТипу(моТип);
Если МетаданныеТипа <> Неопределено
И Не Метаданные.Перечисления.Содержит(МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу(МетаданныеТипа.ПолноеИмя()) Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
ДобавитьВЗапросРегистр(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, "Регистратор", моТип);
КонецЕсли;
Если Не ПустаяСтрока(ТекстЗапроса) Тогда
ВывестиДанные(ТекстЗапроса);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьСписокРегистраторов(ОбъектМетаданных)
МассивРегистраторов = Новый Массив;
МенеджерОбъект = ПолучитьМенеджерОбъекта(ОбъектМетаданных);
Если МенеджерОбъект <> Неопределено Тогда
НаборЗаписей = МенеджерОбъект.СоздатьНаборЗаписей();
ЭлементОтбора = НаборЗаписей.Отбор.Регистратор;
МассивРегистраторов = ЭлементОтбора.ТипЗначения.Типы();
КонецЕсли;
Возврат МассивРегистраторов;
КонецФункции
Функция ПолучитьМенеджерОбъекта(ОбъектМетаданных)
Перем МенеджерОбъекта;
Если Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыБухгалтерии[ОбъектМетаданных.Имя];
ИначеЕсли Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыНакопления[ОбъектМетаданных.Имя];
ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыСведений[ОбъектМетаданных.Имя];
ИначеЕсли Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыРасчета[ОбъектМетаданных.Имя];
КонецЕсли;
Возврат МенеджерОбъекта;
КонецФункции
Функция ПоискПоТипу(ИмяТипа)
Результат = Ложь;
Если ИспользоватьОграничение Тогда
МассивСтрок = ОграничениеТипов.НайтиСтроки(Новый Структура("ТипДанных", ИмяТипа));
Если ЗначениеЗаполнено(МассивСтрок) Тогда
Результат = Истина;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура ДобавитьВЗапросРегистр(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, ИмяРеквизита, ТипРеквизита)
Текст = "ВЫБРАТЬ Об." + ИмяРеквизита + " КАК Объект,
| """ + ИмяТаблицы + "." + ИмяРеквизита + """ КАК ТаблицаИсточник,
| Об.Регистратор КАК ОбъектИсточник,
| " + ДобавитьОписаниеТипа(ИмяРеквизита, ТипРеквизита) + "
|ИЗ
| " + ИмяТаблицы + " КАК Об
|ГДЕ " + ДобавитьУсловия(ИмяРеквизита, ТипРеквизита);
ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса), "", Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС) + Текст;
КонецПроцедуры
Процедура ДобавитьВЗапросОбъект(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, ИмяРеквизита, ТипРеквизита)
Текст = "ВЫБРАТЬ Об." + ИмяРеквизита + " КАК Объект,
| """ + ИмяТаблицы + "." + ИмяРеквизита + """ КАК ТаблицаИсточник,
| Об.Ссылка КАК ОбъектИсточник,
| " + ДобавитьОписаниеТипа(ИмяРеквизита, ТипРеквизита) + "
|ИЗ
| " + ИмяТаблицы + " КАК Об
|ГДЕ " + ДобавитьУсловия(ИмяРеквизита, ТипРеквизита);
ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса), "", Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС) + Текст;
КонецПроцедуры
Функция ДобавитьУсловия(ИмяРеквизита, ТипРеквизита)
мдОбъекта = Метаданные.НайтиПоТипу(ТипРеквизита);
ИмяТаблицы = мдОбъекта.ПолноеИмя();
ПроверкаНаПустыеЗначения = " Об." + ИмяРеквизита + " ССЫЛКА " + ИмяТаблицы;
ПроверкаНаПустыеЗначения = ПроверкаНаПустыеЗначения + " И ВЫРАЗИТЬ(Об." + ИмяРеквизита + " КАК " + ИмяТаблицы + ").Ссылка есть null";
Если Не Метаданные.Перечисления.Содержит(мдОбъекта) Тогда
ПроверкаНаПустыеЗначения = ПроверкаНаПустыеЗначения + " И Об." + ИмяРеквизита + " <> Значение(" + ИмяТаблицы + ".ПустаяСсылка)";
КонецЕсли;
Возврат ПроверкаНаПустыеЗначения;
КонецФункции
Функция ДобавитьОписаниеТипа(ИмяРеквизита, ТипРеквизита)
ОбъектТипа = Метаданные.НайтиПоТипу(ТипРеквизита);
ИмяТаблицы = ОбъектТипа.ПолноеИмя();
ОписаниеТипа = """" + ИмяТаблицы + """ КАК ТипДанных";
Возврат ОписаниеТипа;
КонецФункции
Процедура ОграничениеТиповТипДанныхНачалоВыбора(Элемент, СтандартнаяОбработка)
Перем ЭлементСписка;
СтандартнаяОбработка = Ложь;
Строка = ЭлементыФормы.ОграничениеТипов.ТекущиеДанные;
Если Не ПустаяСтрока(Строка.ТипДанных) Тогда
ЭлементСписка = СписокТипов.НайтиПоЗначению(Строка.ТипДанных);
КонецЕсли;
ВыбранныйЭлемент = СписокТипов.ВыбратьЭлемент( , ЭлементСписка);
Если ВыбранныйЭлемент <> Неопределено Тогда
Строка.ТипДанных = ВыбранныйЭлемент.Значение;
КонецЕсли;
КонецПроцедуры
РеквизитыИсключения = Новый Массив;
ТабличныеЧастиИсключения = Новый Массив;
СписокТипов = Новый СписокЗначений;
Для Каждого ОбъектМетаданных Из Метаданные.Справочники Цикл
СписокТипов.Добавить(ОбъектМетаданных.ПолноеИмя(), ОбъектМетаданных.Имя, , БиблиотекаКартинок.СправочникОбъект);
КонецЦикла;
Для Каждого ОбъектМетаданных Из Метаданные.Документы Цикл
СписокТипов.Добавить(ОбъектМетаданных.ПолноеИмя(), ОбъектМетаданных.Имя, , БиблиотекаКартинок.ДокументОбъект);
КонецЦикла;
КоллекцияОбъектов = Новый Массив;
КоллекцияОбъектов.Добавить(Метаданные.ПланыОбмена);
КоллекцияОбъектов.Добавить(Метаданные.Справочники);
КоллекцияОбъектов.Добавить(Метаданные.Документы);
КоллекцияОбъектов.Добавить(Метаданные.ПланыВидовХарактеристик);
КоллекцияОбъектов.Добавить(Метаданные.ПланыСчетов);
КоллекцияОбъектов.Добавить(Метаданные.ПланыВидовРасчета);
КоллекцияОбъектов.Добавить(Метаданные.БизнесПроцессы);
КоллекцияОбъектов.Добавить(Метаданные.Задачи);
КоллекцияРегистров = Новый Массив;
КоллекцияРегистров.Добавить(Метаданные.РегистрыСведений);
КоллекцияРегистров.Добавить(Метаданные.РегистрыНакопления);
КоллекцияРегистров.Добавить(Метаданные.РегистрыБухгалтерии);
КоллекцияРегистров.Добавить(Метаданные.РегистрыРасчета);
Категория:
1С Общие вопросы - Обычные формы Поле выбора ~ Как ограничить список выбора? Ограничим список элементов, установив отбор в открываемой форме
Код 1C v 8.х //Пример 1
Процедура СтатьяПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
ФормаВыбора = Справочники.ПрочиеДоходыИРасходы.ПолучитьФормуВыбора(, Элемент);
ЭлементОтбораВидПДР = ФормаВыбора.Отбор.ВидПрочихДоходовИРасходов;
Если ЭлементОтбораВидПДР <> Неопределено Тогда
ЭлементОтбораВидПДР.ВидСравнения = ВидСравнения.Равно;
ЭлементОтбораВидПДР.Значение = Перечисления.ВидыПрочихДоходовИРасходов.ПрочиеВнереализационныеДоходыРасходы;
ЭлементОтбораВидПДР.Использование = Истина;
КонецЕсли;
// Закроем доступ к настройке отбора. Таким образом, пользователь не может отключить заданный программно отбор
// и имеет возможность сделать выбор значения только из ограниченного списка.
ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.ВидПрочихДоходовИРасходов.Доступность = Ложь;
ФормаВыбора.Открыть();
СтандартнаяОбработка = Ложь;
КонецПроцедуры
//Пример 2
Процедура СчетДтНачалоВыбора(Элемент, СтандартнаяОбработка)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Хозрасчетный.Ссылка
|ИЗ
| ПланСчетов.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Родитель В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы))
| И Хозрасчетный.ЗапретитьИспользоватьВПроводках = ЛОЖЬ";
СписокСчетов = Новый СписокЗначений;
СписокСчетов.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"));
ФормаВыбора = ПланыСчетов.Хозрасчетный.ПолучитьФормуВыбора(, Элемент);
ЭлементОтбораСсылка = ФормаВыбора.Отбор.Ссылка;
Если ЭлементОтбораСсылка <> Неопределено Тогда
ЭлементОтбораСсылка.ВидСравнения = ВидСравнения.ВСписке;
ЭлементОтбораСсылка.Значение = СписокСчетов;
ЭлементОтбораСсылка.Использование = Истина;
КонецЕсли;
ФормаВыбора.ЭлементыФормы.Список.НастройкаОтбора.Ссылка.Доступность = Ложь;
ФормаВыбора.Открыть();
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Использование выбора из списка
Код 1C v 8.х //Пример 1
Процедура ВидПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
ВидыПДР = Новый СписокЗначений;
ВидыПДР.Добавить(Перечисления.ВидыПрочихДоходовИРасходов.ПрочиеВнереализационныеДоходыРасходы);
ВидыПДР.Добавить(Перечисления.ВидыПрочихДоходовИРасходов.ПрочиеОперационныеДоходыРасходы);
ВыбранныйЭлемент = ВыбратьИзСписка(ВидыПДР, Элемент, ВидыПДР.НайтиПоЗначению(Элемент.Значение));
Если ВыбранныйЭлемент <> Неопределено Тогда
Элемент.Значение = ВыбранныйЭлемент.Значение;
КонецЕсли;
СтандартнаяОбработка = Ложь;
КонецПроцедуры
//Пример 2
Процедура СчетКтНачалоВыбора(Элемент, СтандартнаяОбработка)
СчетаКт = Новый СписокЗначений;
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками);
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПодотчетнымиЛицами);
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПрочимиПоставщикамиИПодрядчиками);
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыПоТекущимОперациям);
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.ПрочиеДоходы);
ВыбранныйЭлемент = ВыбратьИзСписка(СчетаКт, Элемент, СчетаКт.НайтиПоЗначению(Элемент.Значение));
Если ВыбранныйЭлемент <> Неопределено Тогда
Элемент.Значение = ВыбранныйЭлемент.Значение;
КонецЕсли;
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Категория:
Работа с Формой (Диалог) и её элементами Как получить имя перечисления по Синониму? лгоритмически можно получить коллекцию перечислений из конфигурации и перебрав их в цикле сравнить значение реквизита синоним с параметром функции вернуть имя перечисления.
Исходный код функции ИмяПеречисленияПоСинониму (СинонимПеречисления):
Код 1C v 8.х // Возвращает имя перечисления по известному значению синонима
// Пример пСиснонимПеречисления = "Юр физ лицо" тип строка,
// возвращаемое значение имя = "ЮрФизЛицо", тип строка
Функция ИмяПеречисленияПоСинониму( пСинонимПеречисления ) Экспорт
КолекцияПеречислений = Метаданные.Перечисления;
Для каждого пНайденноеЗначение из КолекцияПеречислений Цикл
Если пНайденноеЗначение.Синоним = пСинонимПеречисления Тогда
Возврат пНайденноеЗначение.Имя;
КонецЕсли;
КонецЦикла;
Возврат неопределено;
КонецФункции
Категория:
Перечисления Поле выбора ~ Как отобрать значения выводящиеся в список выбора у элемента формы поле выбора? Использование отбора:
Функционал, который используется для интерактивного отбора в списках, можно использовать и для отбора программным способом.
Для этого нужно для
события НачалоВыбора соответствующего поля ввода определить процедуру обработки и внутри процедуры программно устанавить отбор для списка.
Далее следует пример процедуры обработки
события НачалоВыбора для поля ввода
СтатьяПДР . Реквизит (и поле ввода, соответственно)
СтатьяПДР имеет тип
СправочникСсылка.ПрочиеДоходыИРасходы . Для списка справочника «Прочие доходы и расходы» устанавливается отбор по реквизиту «Вид прочих доходов и расходов» со значением «Прочие внереализационные доходы (расходы)».
Код 1C v 8.х Процедура СтатьяПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
ФормаВыбора = Справочники.ПрочиеДоходыИРасходы.ПолучитьФормуВыбора(, Элемент);
ЭлементОтбораВидПДР = ФормаВыбора.Отбор.ВидПрочихДоходовИРасходов;
Если ЭлементОтбораВидПДР <> Неопределено Тогда
ЭлементОтбораВидПДР.ВидСравнения = ВидСравнения.Равно;
ЭлементОтбораВидПДР.Значение = Перечисления.ВидыПрочихДоходовИРасходов.ПрочиеВнереализационныеДоходыРасходы;
ЭлементОтбораВидПДР.Использование = Истина;
КонецЕсли;
ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.ВидПрочихДоходовИРасходов.Доступность = Ложь;
ФормаВыбора.Открыть();
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Обратите внимание на строку кода:
Код 1C v 8.х ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.ВидПрочихДоходовИРасходов.Доступность = Ложь;
Она закрывает доступ к настройке отбора «Вид прочих доходов и расходов». Таким образом, пользователь не может отключить заданный программно отбор и имеет возможность сделать выбор значения только из ограниченного списка.
Внутри процедуры обработки события НачалоВыбора параметру СтандартнаяОбработка нужно обязательно присвоить значение Ложь. В противном случае будет открыт и ограниченный список, и стандартный список, а это, конечно, не входит в наши планы.
В следующем примере для поля ввода СчетДт типа ПланСчетовСсылка.Хозрасчетный
устанавливается отбор в виде списка счетов . Список счетов предварительно формируется с помощью запроса.
Код 1C v 8.х Процедура СчетДтНачалоВыбора(Элемент, СтандартнаяОбработка)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Хозрасчетный.Ссылка
|ИЗ
| ПланСчетов.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Родитель В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы))
| И Хозрасчетный.ЗапретитьИспользоватьВПроводках = ЛОЖЬ";
СписокСчетов = Новый СписокЗначений;
СписокСчетов.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"));
ФормаВыбора = ПланыСчетов.Хозрасчетный.ПолучитьФормуВыбора(, Элемент);
ЭлементОтбораСсылка = ФормаВыбора.Отбор.Ссылка;
Если ЭлементОтбораСсылка <> Неопределено Тогда
ЭлементОтбораСсылка.ВидСравнения = ВидСравнения.ВСписке;
ЭлементОтбораСсылка.Значение = СписокСчетов;
ЭлементОтбораСсылка.Использование = Истина;
КонецЕсли;
ФормаВыбора.ЭлементыФормы.Список.НастройкаОтбора.Ссылка.Доступность = Ложь;
ФормаВыбора.Открыть();
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Использование выбора из списка:
Выбор значения
Перечисления обычно осуществляется из маленького списка. Но даже если включить выбор из формы (это делается с помощью свойства «Быстрый выбор» поля ввода), функционал отбора для перечислений все равно неприменим.
В таком случае подходящий способ ограничения списка выбора - использование метода формы ВыбратьИзСписка. Аналогично первому способу, необходимо определить процедуру обработки события НачалоВыбора для поля ввода значения. В следующем примере для поля ввода ВидПДР типа ПеречислениеСсылка.ВидыПрочихДоходовИРасходов программно устанавливается ограниченный список выбора.
Код 1C v 8.х Процедура ВидПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
ВидыПДР = Новый СписокЗначений;
ВидыПДР.Добавить(Перечисления.ВидыПрочихДоходовИРасходов.ПрочиеВнереализационныеДоходыРасходы);
ВидыПДР.Добавить(Перечисления.ВидыПрочихДоходовИРасходов.ПрочиеОперационныеДоходыРасходы);
ВыбранныйЭлемент = ВыбратьИзСписка(ВидыПДР, Элемент, ВидыПДР.НайтиПоЗначению(Элемент.Значение));
Если ВыбранныйЭлемент <> Неопределено Тогда
Элемент.Значение = ВыбранныйЭлемент.Значение;
КонецЕсли;
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Результат работы процедуры показан на рисунке. Метод ВыбратьИзСписка открывает маленький список с набором значений, переданных в процедуру в первом параметре (в примере - список значений ВидыПДР).
Пример ограничения списка выбора для перечисления в 1С 8
Пример для других агрегатных типов:
Код 1C v 8.х Процедура СчетКтНачалоВыбора(Элемент, СтандартнаяОбработка)
СчетаКт = Новый СписокЗначений;
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками);
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПодотчетнымиЛицами);
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПрочимиПоставщикамиИПодрядчиками);
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыПоТекущимОперациям);
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.ПрочиеДоходы);
ВыбранныйЭлемент = ВыбратьИзСписка(СчетаКт, Элемент, СчетаКт.НайтиПоЗначению(Элемент.Значение));
Если ВыбранныйЭлемент <> Неопределено Тогда
Элемент.Значение = ВыбранныйЭлемент.Значение;
КонецЕсли;
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Категория:
Работа с Формой (Диалог) и её элементами Как сделать подбор элементов справочника в табличную часть документа? Нужно на форме документа сделать кнопочку Подбор для справочника сотрудники и чтобы выбранные элементы добавлялись в табличное поле документа?
В данной статье я приведу пример подбора элемента справочника в Список значений и в Табличную часть!
Создаем на форме следующие элементы:
Логика такова:
При нажатии на кнопку
ПОДБОР (Процедура КоманднаяПанельПодбор) должена открыться форма подбора сотрудников:
Для Списка значений (СЗ) - ОткрытьФормуВыбораСотрудника(ЭлементыФормы.СписокСотрудников, ЭтотОбъект, Ложь, );
Для Табличного поля (ТП) - ОткрытьФормуВыбораСотрудника(ЭлементыФормы.ТабличноеПолеРаботники, ЭтотОбъект, Ложь, );
Далее открывается форма подбора сотрудника, при двойном щелчке - сотрудник должен добавится в СЗ или ТП.
Для этого у СЗ и ТП в Свойства - События добавляем ОбработкуВыбора :
Для Списка значений (СЗ) - Процедура СписокСотрудниковОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Для Табличного поля (ТП) - Процедура ТабличноеПолеРаботникиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
А в них пропишем проверку, добавлен сотрудник или нет - чтобы не было задвоений!
И так, код будет следующий:
Код 1C v 8.х //Процедура кнопки очистить список значений
Процедура КоманднаяПанельОчистить(Кнопка)
СписокСотрудников.Очистить();
КонецПроцедуры
// Процедура открывает форму выбора сотрудников организации
// Параметры:
// Владелец - владелец формы
// Ключ - ключ, ссылка на объект из которого открывается форма
// ЗакрыватьПриВыборе - Булево, закрывать ли нет
// ГоловнаяОрганизация - головная организация
//
Процедура ОткрытьФормуВыбораСотрудника(Владелец, Ключ, ЗакрыватьПриВыборе, ГоловнаяОрганизация = Неопределено) Экспорт
СтандартнаяОбработка = Ложь;
Форма = Справочники.СотрудникиОрганизаций.ПолучитьФормуВыбора(, Владелец, Ключ);
Форма.ЗакрыватьПриВыборе = ЗакрыватьПриВыборе;
//установим отборы по организации и виду договора
Если ЗначениеЗаполнено(ГоловнаяОрганизация) Тогда
Форма.Отбор.Организация.Установить(ГоловнаяОрганизация);
Форма.Отбор.Организация.Использование = ЗначениеЗаполнено(ГоловнаяОрганизация);
КонецЕсли;
СписокДоговоров = Новый СписокЗначений;
СписокДоговоров.Добавить(Перечисления.ВидыДоговоровСФизЛицами.ТрудовойДоговор);
СписокДоговоров.Добавить(Перечисления.ВидыДоговоровСФизЛицами.Подряда);
СписокДоговоров.Добавить(Перечисления.ВидыДоговоровСФизЛицами.Авторский);
Форма.Отбор.ВидДоговора.ВидСравнения = ВидСравнения.ВСписке;
Форма.Отбор.ВидДоговора.Использование = Истина;
Форма.Отбор.ВидДоговора.Значение = СписокДоговоров;
//Открываем форму выбора
Форма.Заголовок = "Выберите работников:";
Форма.Открыть();
КонецПроцедуры
//Процедура кнопки подбор
Процедура КоманднаяПанельПодбор(Кнопка)
// Процедура для подбора в табличное поля
ОткрытьФормуВыбораСотрудника(ЭлементыФормы.ТабличноеПолеРаботники, ЭтотОбъект, Ложь, );
// Процедура для подбора в список значений
ОткрытьФормуВыбораСотрудника(ЭлементыФормы.СписокСотрудников, ЭтотОбъект, Ложь, );
КонецПроцедуры
//Обработка Выбора значения для списка значений
Процедура СписокСотрудниковОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.СотрудникиОрганизаций") Тогда
//Для того чтобы не было задвоений при выборе, наложим условие
Если СписокСотрудников.НайтиПоЗначению(ВыбранноеЗначение) = Неопределено Тогда
НоваяСтрока = СписокСотрудников.Добавить();
НоваяСтрока.Значение = ВыбранноеЗначение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//Обработка Выбора значения для табличного поля
Процедура ТабличноеПолеРаботникиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.СотрудникиОрганизаций") Тогда
//Для того чтобы не было задвоений при выборе, наложим условие
Если ТабличноеПолеРаботники.НайтиСтроки(Новый Структура("Работник", ВыбранноеЗначение)).Количество() = 0 Тогда
НоваяСтрока = ТабличноеПолеРаботники.Добавить();
НоваяСтрока.Работник = ВыбранноеЗначение;
// далее можно описать заполнение других колонок табличного поля
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Автор: Мигачев Евгений Категория:
Справочники Функция предназначена для получения имени элемента перечисления по значению Код 1C v 8.х
// Предназначена для получения имени элемента перечисления по значению.
//
// Параметры:
// Элемент перечисления.
//
// Возвращаемое значение:
// Строка - имя элемента перечисления в метаданных.
//
Функция ПолучитьИмяЭлементаПеречисленияПоЗначению(ЗначениеПеречисления) Экспорт
ИмяЭлемента = Строка(ЗначениеПеречисления);
Для каждого ЭлементПеречисления Из Метаданные.Перечисления[ЗначениеПеречисления.Метаданные().Имя].ЗначенияПеречисления Цикл
Если ЭлементПеречисления.Синоним = Строка(ЗначениеПеречисления) Тогда
ИмяЭлемента = ЭлементПеречисления.Имя;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ИмяЭлемента;
КонецФункции
Категория:
Перечисления