Как выгрузить все дополнительные обработки и отчеты в каталог? Выгрузить все дополнительные обработки и отчеты в каталог всего за пару кликов. Простейшая обработка в один реквизит и команду.
Набросайте элементы на форму и вставьте код в модуль формы обработки. И без всякого скачивания.
Работоспособность проверена на БП 3.0, Документооборот 1.4-2.0, платформы 1С 8.3.7, 8.3.8
Код 1C v 8.3 #Область ВыборКаталогаДляВыгрузки
&НаКлиенте
Процедура КаталогВыгрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ДопПараметры = новый Структура;
ДопПараметры. Вставить( "ИмяЭлемента" , "КаталогВыгрузки" ) ;
ОписаниеОповещения = Новый ОписаниеОповещения( "ОбработатьВыборКаталога" , ЭтаФорма, ДопПараметры) ;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( РежимДиалогаВыбораФайла. ВыборКаталога) ;
ДиалогОткрытияФайла. МножественныйВыбор = Ложь ;
Если ЗначениеЗаполнено( Объект. КаталогВыгрузки) Тогда
ДиалогОткрытияФайла. Каталог = Объект. КаталогВыгрузки;
КонецЕсли ;
ДиалогОткрытияФайла. Показать( ОписаниеОповещения) ;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВыборКаталога(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
Возврат ;
КонецЕсли ;
Объект[ДополнительныеПараметры. ИмяЭлемента] = ВыбранныеФайлы[0 ];
КонецПроцедуры
#КонецОбласти
#Область НажатиеНаКнопку
&НаКлиенте
Процедура Выгрузить(Команда)
ОчиститьСообщения( ) ;
Если НЕ ЗначениеЗаполнено( Объект. КаталогВыгрузки) Тогда
Сообщить( "Укажите каталог для выгрузки" ) ;
Возврат ;
КонецЕсли ;
Каталог = Новый Файл( Объект. КаталогВыгрузки) ;
Если НЕ Каталог. Существует( ) Тогда
Сообщить( "Указанный каталог не существует" ) ;
Возврат ;
КонецЕсли ;
МассивФайлов = НайтиФайлы( Объект. КаталогВыгрузки, "*.*" ) ;
Если МассивФайлов. Количество( ) > 0 Тогда
ОписаниеОповещения = новый ОписаниеОповещения( "ПодвержденияЗамещения" , ЭтаФорма) ;
ПоказатьВопрос( ОписаниеОповещения, "В каталоге есть файлы. При выгрузке будет выполнение замещение существующих." + Символы. ПС+ "Начать выгрузку?" , РежимДиалогаВопрос. ДаНет) ;
Возврат ;
КонецЕсли ;
ВыгрузкаНачнись( ) ;
КонецПроцедуры
&НаКлиенте
Процедура ПодвержденияЗамещения(ЧтоОтветилПользователь, Параметры) Экспорт
Если ЧтоОтветилПользователь = КодВозвратаДиалога. Да Тогда
ВыгрузкаНачнись( ) ;
Иначе
Возврат ;
КонецЕсли ;
КонецПроцедуры
#КонецОбласти
#Область СамаВыгрузка
&НаКлиенте
Процедура ВыгрузкаНачнись()
ПолучаемыеФайлы = ПодготовимФайлыНаСервере( ЭтаФорма. УникальныйИдентификатор) ;
Обработчик = Новый ОписаниеОповещения( "ОбработкаРезультатаВыгрузки" , ЭтотОбъект) ;
НачатьПолучениеФайлов( Обработчик, ПолучаемыеФайлы, Объект. КаталогВыгрузки, Ложь ) ;
КонецПроцедуры
&НаСервере
Функция ПодготовимФайлыНаСервере(ИдентификаторФормы)
Массив = Новый Массив;
Выборка = Справочники. ДополнительныеОтчетыИОбработки. Выбрать( ) ;
Пока Выборка. Следующий( ) Цикл
Если ТипЗнч( Выборка. ХранилищеОбработки) = Тип( "ХранилищеЗначения" ) Тогда
Адрес = ПоместитьВоВременноеХранилище( Выборка. ХранилищеОбработки. Получить( ) , ИдентификаторФормы) ;
Массив. Добавить( Новый ОписаниеПередаваемогоФайла( Выборка. ИмяФайла, Адрес) ) ;
КонецЕсли ;
КонецЦикла ;
Возврат Массив;
КонецФункции
&НаКлиенте
Процедура ОбработкаРезультатаВыгрузки(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
ПоказатьПредупреждение( , "Выгрузка в каталог завершена" , 10 ) ;
КонецПроцедуры
#КонецОбласти
Автор: Михали Задорнов (MZadornov)
Категория:
Внешние печатные формы, отчеты и обработк�… Вопрос/Сообщение пользователю. Интерфейс Добрый день. Прошу помочь. надо вывести вопрос пользователю, при попытке изменить содержимое поля ввода. В синтакс-помощнике есть примерно такой вариант решения. Пробую при нажатии кнопки "отмена" или "нет"
все равно открывается справочник для выбора пользователя, нужно отменить это, а "Отказ", "Возврат" почему то не работают.........
Процедура ПолеВводаАвторНачалоВыбора(Элемент, СтандартнаяОбработка)
Режим = РежимДиалогаВопрос.ОКОтмена;
текст = "Сменить автора документа?";
ответ= вопрос (Текст, Режим, 0);
Если Ответ = КодВозвратаДиалога.Отмена Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
КонецПроцедуры
Категория:
1С Общие вопросы - Обычные формы Обработка файлов в папке и запись дополнительной информации в них Частенько при загрузке данных в 1С сталкиваешься с необходимостью дополнительной обработки загружаемых файлов. Возможно это добавление какой-либо информации или наоборот удаление, а может изменение.
Ниже приведен код, который обрабатывает файлы в указанной папке и добавляет в конец файла информацию о дате его последнего изменения:
(это лишь рабочий пример / набросок - который вы можете использовать для написания своего обработчика)
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
масФайлов = НайтиФайлы( ПутьКФайлу, "*.w1c" ) ;
Для Каждого стр из масФайлов Цикл
Состояние( "Обработка: " + стр. Имя) ;
текФайл = стр. ПолноеИмя;
ВыбФайл = Новый Файл( текФайл) ;
ДатаИзмененияФайла = Формат( ВыбФайл. ПолучитьУниверсальноеВремяИзменения( ) , "ДЛФ=D" ) ;
текДок = Новый ТекстовыйДокумент;
текДок. Прочитать( текФайл, "UTF-8" ) ;
текТекст = текДок. ПолучитьТекст( ) + Символы. ПС+ "<&w1c&>" + ДатаИзмененияФайла;
текДок. УстановитьТекст( текТекст) ;
текДок. Записать( текФайл, "UTF-8" ) ;
КонецЦикла ;
КонецПроцедуры
Процедура ПриОткрытии()
ПутьКФайлу= "Укажите каталог"
КонецПроцедуры
Процедура ПутьКФайлуНачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
Режим = РежимДиалогаВыбораФайла. ВыборКаталога;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытияФайла. Заголовок = "Выберите Каталог с файлами" ;
Если ДиалогОткрытияФайла. Выбрать( ) Тогда
ПутьКФайлу = ДиалогОткрытияФайла. Каталог;
Иначе
Текст = "ru = "" Файл(ы) не выбран!"" ; en = "" File(s) not selected!"" " ;
Предупреждение( НСтр( Текст) ) ;
КонецЕсли ;
КонецПроцедуры
Сама обработка : ObrabotkaFaylov.rar
Категория:
Работа с Файлами и Каталогами Загрузить данные в 1с из текстового файла с разделителями В этой статье я расскажу, как загружать данные в 1с 8 из простейших текстовых файлов с разделителями. Обычно они имеют расширение csv (Comma-Separated Values). Т. е. название подразумевает, что в каждой строке такого текстового файла значения разделены запятой. Но на самом деле, запятую, в качестве разделителя, использовать не надёжно. Поэтому применяют другие разделители, которые в обычном тексте встречаются редко. Это могут быть символы «^», «~»,«|» и другие. Итак, наша задача состоит в том, чтобы загрузить имеющуюся в csv файле информацию в базу данных 1с. Например, в файле будут содержаться товары интернет - магазина. В качестве образца, я взял выгрузку из магазина на скрипте virtuemart. Посмотрим, как выглядит файл.
Привожу две первых строки из него:
Код ~product_sku~^~category_path~^~product_name~^~product_desc~
~20~^~Книги/Электронные книги~^~Amazon Kindle 4 Touch~^~<p>Популярная электронная книга с ч/б экраном 6", электронной бумагой E-Ink Pearl, разрешением 600x800 пикс. с 16 - ю оттенками серого.</p>~
Посмотрим на файл.
Первая строка служебная. В ней описан формат нашего файла. Т. е. в какой ячейке, что находится. Однако, имейте в виду, что такой строки может и не быть.
Ячейки образуются при помощи разделителя «^», а данные в ячейках обрамляются символом «~».
В любой конфигурации 1с есть иерархический справочник товаров. В него и будем загружать информацию.
Создадим внешнюю обработку. Добавим строковый реквизит «путьКФайлуЗагрузки» для хранения имени файла. Добавим на форму поле ввода, связанное с данным реквизитом. Включим в свойствах поля ввода кнопку выбора и создадим обработчик события «НачалоВыбора» и напишем в нём такой код:
Код 1C v 8.х Процедура путьКФайлуЗагрузкиНачалоВыбора(Элемент, СтандартнаяОбработка)
Режим = РежимДиалогаВыбораФайла. Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытияФайла. ПолноеИмяФайла = "" ;
Фильтр = "Comma separated file (*.csv)|*.csv" ;
ДиалогОткрытияФайла. Фильтр = Фильтр;
ДиалогОткрытияФайла. МножественныйВыбор = Ложь ;
ДиалогОткрытияФайла. Заголовок = "Выберите файл" ;
Если ДиалогОткрытияФайла. Выбрать( ) Тогда
путьКФайлуЗагрузки = ДиалогОткрытияФайла. ПолноеИмяФайла;
КонецЕсли ;
КонецПроцедуры
Т. о. мы организовали диалог для выбора файла в нашей обработке.
Хорошо. Теперь, для удобства и наглядности я предлагаю создать временную табличку, в которую мы загрузим текстовый файл, а уже после её заполнения - будем осуществлять загрузку в базу 1с. Для этого, на форму добавим табличное поле «табЗагрузки», с типом значения «ТаблицаЗначений» и командной панелью. В панели поместим кнопку «Заполнить» и создадим обработчик её нажатия «КоманднаяПанель1Заполнить». Также для элемента универсальности, добавим в обработку два строковых реквизита «символОграничения» и «разделительПолей». В них мы будем хранить «^», и «~». Можно в теле модуля формы осуществить их начальную инициализацию:
разделительПолей = "^";
символОграничения = "~";
Это позволит пользователю задать свои значения и при желании сохранить настройку, которая впоследствии не затрется нашей инициализацией.
Код 1C v 8.х Процедура КоманднаяПанель1Заполнить(Кнопка)
Если табЗагрузки. Количество( ) > 0 И Вопрос( "Таблица будет очищена. Вы уверены?" , РежимДиалогаВопрос. ДаНет)
= КодВозвратаДиалога. Нет Тогда
Возврат ;
КонецЕсли ;
ЗаполнитьТаблицу( ) ;
КонецПроцедуры
Процедура ЗаполнитьТаблицу()
текст = Новый ТекстовыйДокумент;
Попытка
текст. Прочитать( путьКФайлуЗагрузки, КодировкаТекста. UTF8) ;
Исключение
Сообщить( "Не удалось прочитать файл: "
+ ОписаниеОшибки( ) , СтатусСообщения. ОченьВажное) ;
Возврат ;
КонецПопытки ;
табЗагрузки. Очистить( ) ;
табЗагрузки. Колонки. Очистить( ) ;
квоСтрок = текст. КоличествоСтрок( ) ;
Если Не квоСтрок > 0 Тогда
Сообщить( "Файл пустой" , СтатусСообщения. Внимание) ;
Возврат ;
КонецЕсли ;
стрТекста = текст. ПолучитьСтроку( 1 ) ;
масЗначСтр = ОбщегоНазначения. РазложитьСтрокуВМассивПодстрок( стрТекста, разделительПолей) ;
табЗагрузки. Колонки. Добавить( "не_загружать" , Новый ОписаниеТипов( "Булево" ) , "Не загружать" ) ;
табЗагрузки. Колонки. Добавить( "номер_строки" , Новый ОписаниеТипов( "Число" ,
Новый КвалификаторыЧисла( 10 , 0 , ДопустимыйЗнак. Неотрицательный) ) , "Номер строки" ) ;
Для каждого зн Из масЗначСтр Цикл
значение = СтрЗаменить( зн, символОграничения, "" ) ;
кол = табЗагрузки. Колонки. Добавить( значение, Новый ОписаниеТипов( "Строка" ) ) ;
КонецЦикла ;
ЭлементыФормы. табЗагрузки. СоздатьКолонки( ) ;
Для номСтр = 2 По квоСтрок Цикл
стрТекста = текст. ПолучитьСтроку( номСтр) ;
масЗначСтр = ОбщегоНазначения. РазложитьСтрокуВМассивПодстрок( стрТекста, разделительПолей) ;
новСтр = табЗагрузки. Добавить( ) ;
новСтр. номер_строки = номСтр;
номЗнач = 2 ;
Для каждого зн Из масЗначСтр Цикл
новСтр[номЗнач] = СтрЗаменить( зн, символОграничения, "" ) ;
номЗнач = номЗнач + 1 ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Функцию разложения строки с разделителями в массив можно разместить как в одном из общих модулей, так и непосредственно в обработке.
Код 1C v 8.х Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = "," ) Экспорт
МассивСтрок = Новый Массив( ) ;
Если Разделитель = " " Тогда
Стр = СокрЛП( Стр) ;
Пока Истина Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
МассивСтрок. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = СокрЛ( Сред( Стр, Поз) ) ;
КонецЦикла ;
Иначе
ДлинаРазделителя = СтрДлина( Разделитель) ;
Пока Истина Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
МассивСтрок. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = Сред( Стр, Поз+ ДлинаРазделителя) ;
КонецЦикла ;
КонецЕсли ;
КонецФункции
Отлично. В итоге, после заполнения, получим примерно такую картинку:
Теперь приступим непосредственно к загрузке товаров. Рядом с кнопкой «заполнить» добавим кнопку «загрузить» и добавим обработчик её нажатия «КоманднаяПанель1Загрузить», а также добавим реквизит «ПапкаЗагрузкиВыгрузкиТоваров» с типом вашего справочника товаров для опциональной их загрузки в определенную папку. Текст обработчика будет такой:
Код 1C v 8.х Процедура КоманднаяПанель1Загрузить(Кнопка)
Если Вопрос( "Вы уверены, что хотите загрузить файл?" , РежимДиалогаВопрос. ДаНет)
= КодВозвратаДиалога. Нет Тогда
Возврат ;
КонецЕсли ;
ВсегоСтрок = табЗагрузки. Количество( ) ;
номСтр = 1 ;
Для каждого стрТЗ Из табЗагрузки Цикл
Состояние( "Обработано: " + Окр( номСтр * 100 / ВсегоСтрок) + "%" ) ;
номСтр = номСтр + 1 ;
ОбработкаПрерыванияПользователя( ) ;
Если стрТЗ. не_загружать Тогда
Продолжить;
КонецЕсли ;
объект1 С = вернутьТовар( стрТЗ) ;
Если объект1 С = Неопределено Тогда
Возврат ;
КонецЕсли ;
Если Не ЗаписатьЭлементСпр( объект1 С) Тогда
Сообщить( "Загрузка прервана!" , СтатусСообщения. ОченьВажное) ;
Возврат ;
КонецЕсли ;
стрТЗ. не_загружать = Истина ;
КонецЦикла ;
КонецПроцедуры
В приведенном коде две новые функции «вернутьТовар» и «ЗаписатьЭлементСпр». Вот их текст:
Код 1C v 8.х Функция вернутьТовар(стрТабФайла)
Артикул = стрТабФайла. product_sku;
Если Не ЗначениеЗаполнено( Артикул) Тогда
Сообщить( "В строке " + стрТабФайла. номер_строки + " не заполнен product_sku" ,
СтатусСообщения. ОченьВажное) ;
Возврат Неопределено ;
КонецЕсли ;
Запрос = Новый Запрос( "ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул = &Артикул" ) ;
Запрос. УстановитьПараметр( "Артикул" , Артикул) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Если Выборка. Следующий( ) Тогда
Возврат Выборка. Ссылка. ПолучитьОбъект( ) ;
Иначе
ЭтоНовый = Истина ;
объект1 С = Справочники. Номенклатура. СоздатьЭлемент( ) ;
объект1 С. Артикул = Артикул;
объект1 С. Наименование = стрТабФайла. product_name;
объект1 С. Родитель = вернутьРодителяТовара( стрТабФайла. category_path) ;
Возврат объект1 С;
КонецЕсли ;
КонецФункции
Функция ЗаписатьЭлементСпр(Спр)
Попытка
Спр. Записать( ) ;
Исключение
Сообщить( "При записи элемента справочника " + Спр + " возникла ошибка: " + ОписаниеОшибки( ) , СтатусСообщения. ОченьВажное) ;
Возврат Ложь ;
КонецПопытки ;
Возврат Истина ;
КонецФункции
И осталась последняя новая функция для обработки родителя товара вернутьРодителяТовара. Текст её смотрите ниже. Комментарии по тексту.
Код 1C v 8.х Функция вернутьРодителяТовара(стрКатегории)
Родитель = ПапкаЗагрузкиВыгрузкиТоваров;
масРодителей = РазложитьСтрокуВМассивПодстрок( стрКатегории, "/" ) ;
Для каждого Род Из масРодителей Цикл
РодСс = Справочники. Номенклатура. НайтиПоНаименованию( Род, Истина ) ;
Если РодСс. Пустая( ) Тогда
НовРод = Справочники. Номенклатура. СоздатьГруппу( ) ;
НовРод. Наименование = Род;
НовРод. Родитель = Родитель;
Если Не ЗаписатьЭлементСпр( НовРод) Тогда
Возврат Неопределено ;
КонецЕсли ;
Родитель = НовРод. Ссылка;
Иначе
Родитель = РодСс;
КонецЕсли ;
КонецЦикла ;
Возврат Родитель;
КонецФункции
Все. Конечно, в реальной жизни еще много чего нужно будет дописать, но не все сразу. Такой шаблон можно использовать как отправную точку.
Скачивать файлы может только зарегистрированный пользователь!
Успехов в разработке!
Источник Категория:
Текстовый документ Как программно установить событие для элемента формы? Код 1C v 8.х
ДействиеОбработкаВыбора = Новый Действие( "ОбработкаВыбораЗнач" ) ;
ЭлементыФормы["Таблица" ]. УстановитьДействие( "ПередОкончаниемРедактирования" , ДействиеОбработкаВыбора) ;
Код 1C v 8.х
тмпСтраницы = ЭлементыФормы. ОсновнаяПанель. Страницы;
СтраницаПанелиОПЗС = тмпСтраницы. Добавить( "Производство" , "Производство" ) ;
ЭлементыФормы. ОсновнаяПанель. ТекущаяСтраница = СтраницаПанелиОПЗС;
ПолеДокументов = ЭлементыФормы. Добавить( Тип( "ТабличноеПоле" ) , "ап_Призводство" , Истина , ЭлементыФормы. ОсновнаяПанель) ;
ПолеДокументов. Данные = "ап_Производство" ;
ПолеДокументов. УстановитьДействие( "ПередУдалением" , Новый Действие( "апПроизводствоПередУдалением" ) ) ;
ПолеДокументов. УстановитьДействие( "ПередНачаломДобавления" , Новый Действие( "апПроизводствоПередНачаломДобавления" ) ) ;
ПолеДокументов. УстановитьДействие( "ПриПолученииДанных" , Новый Действие( "апПроизводствоПриПолученииДанных" ) ) ;
Код 1C v 8.х Колонка.ЭлементУправления.УстановитьДействие("НачалоВыбора",Новый Действие(Действие"));
Код 1C v 8.х ЭлементыФормы. РасшифровкаПлатежа. Колонки. СтатьяДвиженияДенежныхСредств. ЭлементУправления. УстановитьДействие( "НачалоВыбора" , Новый Действие( "_СтатьяДвиженияДенежныхСредствНачалоВыбора" ) )
Категория:
Работа с Формой (Диалог) и её элементами Поиск в базе битых ссылок - "объект не найден" В статье
Битая ссылка, <Объект не найден>, Уникальный Идентификатор, GUID мы обсуждали как востановить битые ссылки!
А вот как найти в базе все битые ссылки, которые имеют вид типа "<Объект не найден> (137:8b270030482898d011daad3cc45fc830)"?
Для поиска этого была написана данная обработка:
Скачивать файлы может только зарегистрированный пользователь!
Для поиска: Выбираем объекты метаданных , которые хотим проверить, жмем кнопочку "Выполнить" и наблюдаем в таблице выходные данные. Откуда можем попасть в объекты-источники.
Для программиста:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
ИспользоватьОграничение = ЗначениеЗаполнено( ОграничениеТипов) ;
РезультатПоиска. Очистить( ) ;
Для Каждого ОбъектыМетаданных Из КоллекцияОбъектов Цикл
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Состояние( ОбъектМетаданных. ПолноеИмя( ) ) ;
ПроверитьОбъектНаБитыеСсылки( ОбъектМетаданных) ;
КонецЦикла ;
КонецЦикла ;
Для Каждого ОбъектыМетаданных Из КоллекцияРегистров Цикл
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Состояние( ОбъектМетаданных. ПолноеИмя( ) ) ;
ПроверитьРегистрНаБитыеСсылки( ОбъектМетаданных) ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура ВывестиДанные(ТекстЗапроса)
Запрос = Новый Запрос( ТекстЗапроса) ;
Попытка
РезультатЗапроса = Запрос. Выполнить( ) ;
Если Не РезультатЗапроса. Пустой( ) Тогда
ТЗ = РезультатЗапроса. Выгрузить( ) ;
Для Каждого Стр Из ТЗ Цикл
ОбработкаПрерыванияПользователя( ) ;
Строка = РезультатПоиска. Добавить( ) ;
ЗаполнитьЗначенияСвойств( Строка, Стр) ;
КонецЦикла ;
КонецЕсли ;
Исключение
Сообщить( ИнформацияОбОшибке( ) . Описание + " " + ИнформацияОбОшибке( ) . Причина) ;
КонецПопытки ;
КонецПроцедуры
Процедура ПроверитьРегистрНаБитыеСсылки(ОбъектМетаданных)
ИмяТаблицы = ОбъектМетаданных. ПолноеИмя( ) ;
Если Метаданные. РегистрыСведений. Содержит( ОбъектМетаданных) Тогда
Если ОбъектМетаданных. РежимЗаписи = НезависимыйРежимЗаписи Тогда
Возврат ;
КонецЕсли ;
АнализСвойствРегистра( ОбъектМетаданных, ОбъектМетаданных. Реквизиты, ИмяТаблицы) ;
КонецЕсли ;
АнализСвойствРегистра( ОбъектМетаданных, ОбъектМетаданных. Измерения, ИмяТаблицы) ;
АнализСвойствРегистра( ОбъектМетаданных, ОбъектМетаданных. Реквизиты, ИмяТаблицы) ;
АнализРегистратораРегистра( ОбъектМетаданных, ИмяТаблицы) ;
Если Метаданные. РегистрыБухгалтерии. Содержит( ОбъектМетаданных) Тогда
КонецЕсли ;
Если Метаданные. РегистрыРасчета. Содержит( ОбъектМетаданных) Тогда
КонецЕсли ;
КонецПроцедуры
Процедура ПроверитьОбъектНаБитыеСсылки(ОбъектМетаданных)
ИмяТаблицы = ОбъектМетаданных. ПолноеИмя( ) ;
АнализСвойствОбъекта( ОбъектМетаданных, ОбъектМетаданных. Реквизиты, ИмяТаблицы) ;
Для Каждого ТабЧасть Из ОбъектМетаданных. ТабличныеЧасти Цикл
Если ТабличныеЧастиИсключения. Найти( ТабЧасть. Имя) < > Неопределено Тогда
Продолжить;
КонецЕсли ;
АнализСвойствОбъекта( ОбъектМетаданных, ТабЧасть. Реквизиты, ИмяТаблицы + "." + ТабЧасть. Имя)
КонецЦикла ;
Если Метаданные. Справочники. Содержит( ОбъектМетаданных) И ОбъектМетаданных. Владельцы. Количество( ) > 0 Тогда
МассивВладельцев = Новый Массив;
Для Каждого Элемент Из ОбъектМетаданных. Владельцы Цикл
МассивВладельцев. Добавить( Элемент) ;
КонецЦикла ;
КонецЕсли ;
ОбработкаПрерыванияПользователя( ) ;
КонецПроцедуры
Процедура АнализСвойствОбъекта(ОбъектМетаданных, Свойства, ИмяТаблицы)
Для Каждого Реквизит Из Свойства Цикл
Если РеквизитыИсключения. Найти( Реквизит. Имя) < > Неопределено Тогда
Продолжить;
КонецЕсли ;
Для Каждого моТип Из Реквизит. Тип. Типы( ) Цикл
ТекстЗапроса = "" ;
МетаданныеТипа = Метаданные. НайтиПоТипу( моТип) ;
Если МетаданныеТипа < > Неопределено
И Не Метаданные. Перечисления. Содержит( МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу( МетаданныеТипа. ПолноеИмя( ) ) Тогда
Продолжить;
КонецЕсли ;
КонецЕсли ;
ДобавитьВЗапросОбъект( ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, Реквизит. Имя, моТип) ;
КонецЕсли ;
Если Не ПустаяСтрока( ТекстЗапроса) Тогда
ВывестиДанные( ТекстЗапроса) ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура АнализСвойствРегистра(ОбъектМетаданных, Свойства, ИмяТаблицы)
Для Каждого Реквизит Из Свойства Цикл
Если РеквизитыИсключения. Найти( Реквизит. Имя) < > Неопределено Тогда
Продолжить;
КонецЕсли ;
Для Каждого моТип Из Реквизит. Тип. Типы( ) Цикл
ТекстЗапроса = "" ;
МетаданныеТипа = Метаданные. НайтиПоТипу( моТип) ;
Если МетаданныеТипа < > Неопределено
И Не Метаданные. Перечисления. Содержит( МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу( МетаданныеТипа. ПолноеИмя( ) ) Тогда
Продолжить;
КонецЕсли ;
КонецЕсли ;
ДобавитьВЗапросРегистр( ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, Реквизит. Имя, моТип) ;
КонецЕсли ;
Если Не ПустаяСтрока( ТекстЗапроса) Тогда
ВывестиДанные( ТекстЗапроса) ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура АнализРегистратораРегистра(ОбъектМетаданных, ИмяТаблицы)
МассивРегистраторов = ПолучитьСписокРегистраторов( ОбъектМетаданных) ;
Для Каждого Регистратор Из МассивРегистраторов Цикл
Если РеквизитыИсключения. Найти( "Регистратор" ) < > Неопределено Тогда
Продолжить;
КонецЕсли ;
моТип = Регистратор;
ТекстЗапроса = "" ;
МетаданныеТипа = Метаданные. НайтиПоТипу( моТип) ;
Если МетаданныеТипа < > Неопределено
И Не Метаданные. Перечисления. Содержит( МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу( МетаданныеТипа. ПолноеИмя( ) ) Тогда
Продолжить;
КонецЕсли ;
КонецЕсли ;
ДобавитьВЗапросРегистр( ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, "Регистратор" , моТип) ;
КонецЕсли ;
Если Не ПустаяСтрока( ТекстЗапроса) Тогда
ВывестиДанные( ТекстЗапроса) ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Функция ПолучитьСписокРегистраторов(ОбъектМетаданных)
МассивРегистраторов = Новый Массив;
МенеджерОбъект = ПолучитьМенеджерОбъекта( ОбъектМетаданных) ;
Если МенеджерОбъект < > Неопределено Тогда
НаборЗаписей = МенеджерОбъект. СоздатьНаборЗаписей( ) ;
ЭлементОтбора = НаборЗаписей. Отбор. Регистратор;
МассивРегистраторов = ЭлементОтбора. ТипЗначения. Типы( ) ;
КонецЕсли ;
Возврат МассивРегистраторов;
КонецФункции
Функция ПолучитьМенеджерОбъекта(ОбъектМетаданных)
Перем МенеджерОбъекта;
Если Метаданные. РегистрыБухгалтерии. Содержит( ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыБухгалтерии[ОбъектМетаданных. Имя];
ИначеЕсли Метаданные. РегистрыНакопления. Содержит( ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыНакопления[ОбъектМетаданных. Имя];
ИначеЕсли Метаданные. РегистрыСведений. Содержит( ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыСведений[ОбъектМетаданных. Имя];
ИначеЕсли Метаданные. РегистрыРасчета. Содержит( ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыРасчета[ОбъектМетаданных. Имя];
КонецЕсли ;
Возврат МенеджерОбъекта;
КонецФункции
Функция ПоискПоТипу(ИмяТипа)
Результат = Ложь ;
Если ИспользоватьОграничение Тогда
МассивСтрок = ОграничениеТипов. НайтиСтроки( Новый Структура( "ТипДанных" , ИмяТипа) ) ;
Если ЗначениеЗаполнено( МассивСтрок) Тогда
Результат = Истина ;
КонецЕсли ;
КонецЕсли ;
Возврат Результат;
КонецФункции
Процедура ДобавитьВЗапросРегистр(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, ИмяРеквизита, ТипРеквизита)
Текст = "ВЫБРАТЬ Об." + ИмяРеквизита + " КАК Объект,
| "" " + ИмяТаблицы + "." + ИмяРеквизита + """ КАК ТаблицаИсточник,
| Об.Регистратор КАК ОбъектИсточник,
| " + ДобавитьОписаниеТипа( ИмяРеквизита, ТипРеквизита) + "
|ИЗ
| " + ИмяТаблицы + " КАК Об
|ГДЕ " + ДобавитьУсловия( ИмяРеквизита, ТипРеквизита) ;
ТекстЗапроса = ТекстЗапроса + ? ( ПустаяСтрока( ТекстЗапроса) , "" , Символы. ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы. ПС) + Текст;
КонецПроцедуры
Процедура ДобавитьВЗапросОбъект(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, ИмяРеквизита, ТипРеквизита)
Текст = "ВЫБРАТЬ Об." + ИмяРеквизита + " КАК Объект,
| "" " + ИмяТаблицы + "." + ИмяРеквизита + """ КАК ТаблицаИсточник,
| Об.Ссылка КАК ОбъектИсточник,
| " + ДобавитьОписаниеТипа( ИмяРеквизита, ТипРеквизита) + "
|ИЗ
| " + ИмяТаблицы + " КАК Об
|ГДЕ " + ДобавитьУсловия( ИмяРеквизита, ТипРеквизита) ;
ТекстЗапроса = ТекстЗапроса + ? ( ПустаяСтрока( ТекстЗапроса) , "" , Символы. ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы. ПС) + Текст;
КонецПроцедуры
Функция ДобавитьУсловия(ИмяРеквизита, ТипРеквизита)
мдОбъекта = Метаданные. НайтиПоТипу( ТипРеквизита) ;
ИмяТаблицы = мдОбъекта. ПолноеИмя( ) ;
ПроверкаНаПустыеЗначения = " Об." + ИмяРеквизита + " ССЫЛКА " + ИмяТаблицы;
ПроверкаНаПустыеЗначения = ПроверкаНаПустыеЗначения + " И ВЫРАЗИТЬ(Об." + ИмяРеквизита + " КАК " + ИмяТаблицы + ").Ссылка есть null" ;
Если Не Метаданные. Перечисления. Содержит( мдОбъекта) Тогда
ПроверкаНаПустыеЗначения = ПроверкаНаПустыеЗначения + " И Об." + ИмяРеквизита + " <> Значение(" + ИмяТаблицы + ".ПустаяСсылка)" ;
КонецЕсли ;
Возврат ПроверкаНаПустыеЗначения;
КонецФункции
Функция ДобавитьОписаниеТипа(ИмяРеквизита, ТипРеквизита)
ОбъектТипа = Метаданные. НайтиПоТипу( ТипРеквизита) ;
ИмяТаблицы = ОбъектТипа. ПолноеИмя( ) ;
ОписаниеТипа = """ " + ИмяТаблицы + """ КАК ТипДанных" ;
Возврат ОписаниеТипа;
КонецФункции
Процедура ОграничениеТиповТипДанныхНачалоВыбора(Элемент, СтандартнаяОбработка)
Перем ЭлементСписка;
СтандартнаяОбработка = Ложь ;
Строка = ЭлементыФормы. ОграничениеТипов. ТекущиеДанные;
Если Не ПустаяСтрока( Строка. ТипДанных) Тогда
ЭлементСписка = СписокТипов. НайтиПоЗначению( Строка. ТипДанных) ;
КонецЕсли ;
ВыбранныйЭлемент = СписокТипов. ВыбратьЭлемент( , ЭлементСписка) ;
Если ВыбранныйЭлемент < > Неопределено Тогда
Строка. ТипДанных = ВыбранныйЭлемент. Значение;
КонецЕсли ;
КонецПроцедуры
РеквизитыИсключения = Новый Массив;
ТабличныеЧастиИсключения = Новый Массив;
СписокТипов = Новый СписокЗначений;
Для Каждого ОбъектМетаданных Из Метаданные. Справочники Цикл
СписокТипов. Добавить( ОбъектМетаданных. ПолноеИмя( ) , ОбъектМетаданных. Имя, , БиблиотекаКартинок. СправочникОбъект) ;
КонецЦикла ;
Для Каждого ОбъектМетаданных Из Метаданные. Документы Цикл
СписокТипов. Добавить( ОбъектМетаданных. ПолноеИмя( ) , ОбъектМетаданных. Имя, , БиблиотекаКартинок. ДокументОбъект) ;
КонецЦикла ;
КоллекцияОбъектов = Новый Массив;
КоллекцияОбъектов. Добавить( Метаданные. ПланыОбмена) ;
КоллекцияОбъектов. Добавить( Метаданные. Справочники) ;
КоллекцияОбъектов. Добавить( Метаданные. Документы) ;
КоллекцияОбъектов. Добавить( Метаданные. ПланыВидовХарактеристик) ;
КоллекцияОбъектов. Добавить( Метаданные. ПланыСчетов) ;
КоллекцияОбъектов. Добавить( Метаданные. ПланыВидовРасчета) ;
КоллекцияОбъектов. Добавить( Метаданные. БизнесПроцессы) ;
КоллекцияОбъектов. Добавить( Метаданные. Задачи) ;
КоллекцияРегистров = Новый Массив;
КоллекцияРегистров. Добавить( Метаданные. РегистрыСведений) ;
КоллекцияРегистров. Добавить( Метаданные. РегистрыНакопления) ;
КоллекцияРегистров. Добавить( Метаданные. РегистрыБухгалтерии) ;
КоллекцияРегистров. Добавить( Метаданные. РегистрыРасчета) ;
Категория:
1С Общие вопросы - Обычные формы Фильтрация иерархического справочника по какому-либо условию в форме списка Есть ли в 8.х аналог ИспользоватьСписокЭлементов?
В динамических списках документов, справочников и т.д. может быть программно установлен отбор по полю Ссылка с указанием в качестве вида сравнения вхождения в список значений. Это позволяет отображать в списке только определенные объекты.
Однако эта возможность может иметь только ограниченное применение, так как динамический список имеет достаточно большое количество универсальных возможностей (установка отбора пользователем, переходы по уровням в иерархических списках и т.д.) и совмещение в прикладных решениях этих механизмов с отбором по конкретным значениям ссылок достаточно сложно реализуется.
В большинстве случаев, если необходимо обеспечить отображение в списке специально отобранного перечня объектов, можно рекомендовать использовать другие возможности (например, выборку данных запросом и отображение в форме с помощью таблицы значений или табличного документа). При этом система обеспечивает возможность полноценного взаимодействия с такими формами других системных механизмов.
Код 1C v 8.х Запрос = Новый Запрос( ) ;
Запрос. Текст = " ВЫБРАТЬ
| СпецификацииНоменклатуры.Ссылка
|ИЗ
| Справочник.СпецификацииНоменклатуры КАК СпецификацииНоменклатуры
|ГДЕ
| СпецификацииНоменклатуры.Владелец.Ссылка = &НоменклатураСсылка
| И СпецификацииНоменклатуры.Организация В ИЕРАРХИИ (&Организация)" ;
Запрос. УстановитьПараметр( "НоменклатураСсылка" , ГотоваяПродукция) ;
Запрос. УстановитьПараметр( "Организация" , Организация) ;
СписокСпецификаций = Запрос. Выполнить( ) . Выгрузить( ) . ВыгрузитьКолонку( "Ссылка" ) ;
ФормаВыбора = Справочники. СпецификацииНоменклатуры. ПолучитьФормуВыбора( , Элемент, Элемент) ;
ЭлементОтбора = ФормаВыбора. СправочникСписок. Отбор. Ссылка;
ЭлементОтбора. ВидСравнения = ВидСравнения. ВСписке;
ЭлементОтбора. Значение = СписокСпецификаций;
ЭлементОтбора. Использование = Истина ;
ФормаВыбора. ЭлементыФормы. СправочникСписок. НастройкаОтбора. Ссылка. Доступность = Ложь ;
ФормаВыбора. Открыть( ) ;
Код 1C v 8.2 УП &НаКлиенте
Процедура ПоУмолчаниюОпцияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
ФормаВыбора = ПолучитьФорму( "Справочник.ОпцииАвтомобилей.Форма.ФормаВыбора" ) ;
ФормаВыбора. Открыть( ) ;
ЭлементОтбора = ФормаВыбора. Список. Отбор. Элементы. Добавить( Тип( "ЭлементОтбораКомпоновкиДанных" ) ) ;
ЭлементОтбора. ЛевоеЗначение = Новый ПолеКомпоновкиДанных( "Ссылка" ) ;
ЭлементОтбора. ВидСравнения = ВидСравненияКомпоновкиДанных. ВСписке;
ЭлементОтбора. ПравоеЗначение = СписокОпций;
ЭлементОтбора. Использование = Истина ;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СписокОпций. ЗагрузитьЗначения( Объект. Владелец. ОпцииМодели. Выгрузить( ) . ВыгрузитьКолонку( "Опция" ) ) ;
КонецПроцедуры
Для 7.7 используем метод ИспользоватьСписокЭлементов
Автор:
Antoska
Для решения данной задачи я решил воспользоваться методом формы списка "ИспользоватьСписокЭлементов(<СписокЗначений>)", так как использование процедуры "ОбработкаПодбора()" требует наличия реквизита справочника для отбора, а это мне не очень подходит. Вот как я реализовал этот алгоритм (код из модуля формы списка справочника):
Код 1C v 7.x Функция СоответствуетУсловиямФильтра(ЭлементСправочника)
Если ПустоеЗначение( ЭлементСправочника) = 0 Тогда
Если Регистр. ПартииТоваров. СводныйОстаток( "" , ЭлементСправочника. ТекущийЭлемент( ) , , , , , "ОстатокТовара" ) < > 0 Тогда
Возврат 1 ;
КонецЕсли ;
КонецЕсли ;
Возврат 0 ;
КонецФункции
Процедура УстановитьФильтр(Знач Группа="" , Знач Иерархия="" )
Если Фильтр = 1 Тогда
Группа = ? ( Группа= "" , ТекущийЭлемент( ) . Родитель, Группа) ;
Иерархия = ? ( Иерархия= "" , ИерархическийСписок( ) , Иерархия) ;
СписокФильтра = СоздатьОбъект( "СписокЗначений" ) ;
Спр = СоздатьОбъект( "Справочник.Номенклатура" ) ;
Если ПустоеЗначение( Группа) = 0 Тогда
Спр. ИспользоватьРодителя( Группа) ;
КонецЕсли ;
Спр. ВключатьПодчиненные( 0 ) ;
Спр. ВыбратьЭлементы( Иерархия) ;
Пока Спр. ПолучитьЭлемент( ) = 1 Цикл
Если Спр. ЭтоГруппа( ) = 1 Тогда
СписокФильтра. ДобавитьЗначение( Спр. ТекущийЭлемент( ) ) ;
Продолжить;
КонецЕсли ;
Если СоответствуетУсловиямФильтра( Спр. ТекущийЭлемент( ) ) = 1 Тогда
СписокФильтра. ДобавитьЗначение( Спр. ТекущийЭлемент( ) ) ;
КонецЕсли ;
КонецЦикла ;
ИспользоватьСписокЭлементов( СписокФильтра) ;
Иначе
ИспользоватьСписокЭлементов( ) ;
КонецЕсли ;
КонецПроцедуры
Процедура ПриВыбореРодителя(Элемент)
УстановитьФильтр( Элемент)
КонецПроцедуры
Процедура ПриСменеИерархии(Способ)
УстановитьФильтр( , Способ)
КонецПроцедуры
Функцией "СоответствуетУсловиямФильтра(ЭлементСправочника)" можно задавать любые условия фильтрации списка опираясь на передаваемый ей элемент справочника.
Скорость работы приемлема, но можно попробовать реализовать и через запрос...
Категория:
Справочники Поле выбора ~ Как ограничить список выбора? Ограничим список элементов, установив отбор в открываемой форме
Код 1C v 8.х
Процедура СтатьяПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
ФормаВыбора = Справочники. ПрочиеДоходыИРасходы. ПолучитьФормуВыбора( , Элемент) ;
ЭлементОтбораВидПДР = ФормаВыбора. Отбор. ВидПрочихДоходовИРасходов;
Если ЭлементОтбораВидПДР < > Неопределено Тогда
ЭлементОтбораВидПДР. ВидСравнения = ВидСравнения. Равно;
ЭлементОтбораВидПДР. Значение = Перечисления. ВидыПрочихДоходовИРасходов. ПрочиеВнереализационныеДоходыРасходы;
ЭлементОтбораВидПДР. Использование = Истина ;
КонецЕсли ;
ФормаВыбора. ЭлементыФормы. СправочникСписок. НастройкаОтбора. ВидПрочихДоходовИРасходов. Доступность = Ложь ;
ФормаВыбора. Открыть( ) ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
Процедура СчетДтНачалоВыбора(Элемент, СтандартнаяОбработка)
Запрос = Новый Запрос;
Запрос. Текст = "ВЫБРАТЬ
| Хозрасчетный.Ссылка
|ИЗ
| ПланСчетов.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Родитель В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы))
| И Хозрасчетный.ЗапретитьИспользоватьВПроводках = ЛОЖЬ" ;
СписокСчетов = Новый СписокЗначений;
СписокСчетов. ЗагрузитьЗначения( Запрос. Выполнить( ) . Выгрузить( ) . ВыгрузитьКолонку( "Ссылка" ) ) ;
ФормаВыбора = ПланыСчетов. Хозрасчетный. ПолучитьФормуВыбора( , Элемент) ;
ЭлементОтбораСсылка = ФормаВыбора. Отбор. Ссылка;
Если ЭлементОтбораСсылка < > Неопределено Тогда
ЭлементОтбораСсылка. ВидСравнения = ВидСравнения. ВСписке;
ЭлементОтбораСсылка. Значение = СписокСчетов;
ЭлементОтбораСсылка. Использование = Истина ;
КонецЕсли ;
ФормаВыбора. ЭлементыФормы. Список. НастройкаОтбора. Ссылка. Доступность = Ложь ;
ФормаВыбора. Открыть( ) ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
Использование выбора из списка
Код 1C v 8.х
Процедура ВидПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
ВидыПДР = Новый СписокЗначений;
ВидыПДР. Добавить( Перечисления. ВидыПрочихДоходовИРасходов. ПрочиеВнереализационныеДоходыРасходы) ;
ВидыПДР. Добавить( Перечисления. ВидыПрочихДоходовИРасходов. ПрочиеОперационныеДоходыРасходы) ;
ВыбранныйЭлемент = ВыбратьИзСписка( ВидыПДР, Элемент, ВидыПДР. НайтиПоЗначению( Элемент. Значение) ) ;
Если ВыбранныйЭлемент < > Неопределено Тогда
Элемент. Значение = ВыбранныйЭлемент. Значение;
КонецЕсли ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
Процедура СчетКтНачалоВыбора(Элемент, СтандартнаяОбработка)
СчетаКт = Новый СписокЗначений;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. РасчетыСПоставщиками) ;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. РасчетыСПодотчетнымиЛицами) ;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. РасчетыСПрочимиПоставщикамиИПодрядчиками) ;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. РасчетыПоТекущимОперациям) ;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. ПрочиеДоходы) ;
ВыбранныйЭлемент = ВыбратьИзСписка( СчетаКт, Элемент, СчетаКт. НайтиПоЗначению( Элемент. Значение) ) ;
Если ВыбранныйЭлемент < > Неопределено Тогда
Элемент. Значение = ВыбранныйЭлемент. Значение;
КонецЕсли ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
Категория:
Работа с Формой (Диалог) и её элементами Открытие, перемещение и загрузка файла Пример обработки загрузки данных на управляемой форме, с определением необходимости передачи файла на сервер:
Код 1C v 8.2 УП &НаКлиенте
Процедура ИмяФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Диалог = Новый ДиалогВыбораФайла( РежимДиалогаВыбораФайла. Открытие) ;
Диалог. Фильтр = "*.xml|*.xml" ;
Если Диалог. Выбрать( ) Тогда
Объект. ИмяФайла = Диалог. ПолноеИмяФайла;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура ИмяФайлаОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
ЗапуститьПриложение( Объект. ИмяФайла) ;
КонецПроцедуры
&НаКлиенте
Процедура Загрузить(Команда)
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы( ) ;
ws = НСтр( СтрокаСоединения, "ws" ) ;
ИмяСервера = НСтр( СтрокаСоединения, "Srvr" ) ;
Если ИмяСервера = "" Тогда
Если ws = "" Тогда
ПередачаФайлаНаСервер = Ложь ;
Иначе
ПередачаФайлаНаСервер = Истина ;
КонецЕсли ;
Иначе
ПередачаФайлаНаСервер = ( ИмяКомпьютера( ) < > ИмяСервера) ;
КонецЕсли ;
Если ПередачаФайлаНаСервер Тогда
ПоместитьФайл( АдресХранилища, Объект. ИмяФайла, , Ложь , УникальныйИдентификатор) ;
КонецЕсли ;
ЗагрузитьСервер( ) ;
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьСервер()
ЧтениеXML = Новый ЧтениеXML;
Если ПередачаФайлаНаСервер Тогда
ИмяВременногоФайла = ПолучитьИмяВременногоФайла( "xml" ) ;
ДвоичныеДанные = ПолучитьИзВременногоХранилища( АдресХранилища) ;
ДвоичныеДанные. Записать( ИмяВременногоФайла) ;
ЧтениеXML. ОткрытьФайл( ИмяВременногоФайла) ;
Иначе
ЧтениеXML. ОткрытьФайл( Объект. ИмяФайла) ;
КонецЕсли ;
ОбъектXDTO = ФабрикаXDTO. ПрочитатьXML( ЧтениеXML) ;
ЧтениеXML. Закрыть( ) ;
Сообщить( "Загрузка завершена" ) ;
КонецПроцедуры
Категория:
Работа с Файлами и Каталогами Как для Выбора Элемента Справочника Открыть Форму Выбора с нужной Открытой Группой? Порядок действий такой:
1. В поле ввода "Номенклатура" добавь событие ПриНачалеВыбора.
2. Установи в них СтандартнаяОбработка = Ложь;
3. Получи форму выбора нужного справочника
4. Установи отбор по родителю
5. Открой форму для выбора
Теперь подробнее:
Заходим в Свойства реквизита - для которогу нужно настроить выбор из группы, это может быть реквизит табличной части или просто реквизит на форме, и Задаем
Событие - Начало Выбора
Далее пишем ее код:
Код 1C v 8.х Процедура ТЧНоменклатураНачалоВыбора(Элемент, СтандартнаяОбработка)
//Отключим стандартный выбор, так как делаем свой
СтандартнаяОбработка = Ложь;
//НУЖНО чтобы при открытии Выбора номенклатуры Открывалась номенклатура из Групы Оргтехника (код 00000013608)
//Получаем форму и привязываем ее к Владельцу - Элемент
ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора(, Элемент);
//Установим отбор по Родителю справочника
//ЕСЛИ НА ФОРМЕ ВЫБОРА СЛЕВА ЕСТЬ ДЕРЕВО ГРУПП, то нужно установить значение родителя в нем:
ФормаВыбора.ЭлементыФормы.СправочникДерево.ТекущаяСтрока = Справочники.Номенклатура.НайтиПоКоду("00000013608");
//ЕСЛИ НА ФОРМЕ ТОЛЬКО СПИСОК НОМЕНКЛАТУРЫ, то устанавливаем так:
ФормаВыбора.ЭлементыФормы.СправочникСписок.ИерархическийПросмотр = Истина;
ФормаВыбора.ЭлементыФормы.СправочникСписок.ТекущийРодитель = Справочники.Номенклатура.НайтиПоКоду("00000013608");
//Откроем выбор
ФормаВыбора.ОткрытьМодально();
КонецПроцедуры
Запускаем, пробуем, радуемся
P.S. Написано как ответ на вопрос
Позиционирование сразу в папке номенклатуры 8.1 Категория:
Справочники Как для Выбора Покупателя Открыть Справочник контрагенты с открытой группой "Покупатели"? Код 1C v 8.х
Процедура КонтрагентНачалоВыбора(Элемент, СтандартнаяОбработка)
Если Элемент. Значение. Пустая( ) Тогда
СтандартнаяОбработка = Ложь ;
ФормаВыбора = Справочники. Контрагенты. ПолучитьФормуВыбора( , Элемент) ;
ФормаВыбора. ВыборПокупателя = Истина ;
ФормаВыбора. Открыть( ) ;
КонецЕсли ;
КонецПроцедуры
Если ВыборПокупателя Тогда
ЭлементыФормы. СправочникСписок. ИерархическийПросмотр = Истина ;
ЭлементыФормы. СправочникСписок. ТекущийРодитель = Константы. ГруппаПокупатели. Получить( ) ;
КонецЕсли ;
Если ВыборПокупателя Тогда
ЭлементыФормы. СправочникСписок. ИерархическийПросмотр = Истина ;
ЭлементыФормы. СправочникСписок. ТекущийРодитель = Справочники. Контрагенты. Покупатели;
КонецЕсли ;
Категория:
Справочники Поле выбора ~ Как отобрать значения выводящиеся в список выбора у элемента формы поле выбора? Использование отбора:
Функционал, который используется для интерактивного отбора в списках, можно использовать и для отбора программным способом.
Для этого нужно для
события НачалоВыбора соответствующего поля ввода определить процедуру обработки и внутри процедуры программно устанавить отбор для списка.
Далее следует пример процедуры обработки
события НачалоВыбора для поля ввода
СтатьяПДР . Реквизит (и поле ввода, соответственно)
СтатьяПДР имеет тип
СправочникСсылка.ПрочиеДоходыИРасходы . Для списка справочника «Прочие доходы и расходы» устанавливается отбор по реквизиту «Вид прочих доходов и расходов» со значением «Прочие внереализационные доходы (расходы)».
Код 1C v 8.х Процедура СтатьяПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
ФормаВыбора = Справочники. ПрочиеДоходыИРасходы. ПолучитьФормуВыбора( , Элемент) ;
ЭлементОтбораВидПДР = ФормаВыбора. Отбор. ВидПрочихДоходовИРасходов;
Если ЭлементОтбораВидПДР < > Неопределено Тогда
ЭлементОтбораВидПДР. ВидСравнения = ВидСравнения. Равно;
ЭлементОтбораВидПДР. Значение = Перечисления. ВидыПрочихДоходовИРасходов. ПрочиеВнереализационныеДоходыРасходы;
ЭлементОтбораВидПДР. Использование = Истина ;
КонецЕсли ;
ФормаВыбора. ЭлементыФормы. СправочникСписок. НастройкаОтбора. ВидПрочихДоходовИРасходов. Доступность = Ложь ;
ФормаВыбора. Открыть( ) ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
Обратите внимание на строку кода:
Код 1C v 8.х ФормаВыбора. ЭлементыФормы. СправочникСписок. НастройкаОтбора. ВидПрочихДоходовИРасходов. Доступность = Ложь ;
Она закрывает доступ к настройке отбора «Вид прочих доходов и расходов». Таким образом, пользователь не может отключить заданный программно отбор и имеет возможность сделать выбор значения только из ограниченного списка.
Внутри процедуры обработки события НачалоВыбора параметру СтандартнаяОбработка нужно обязательно присвоить значение Ложь. В противном случае будет открыт и ограниченный список, и стандартный список, а это, конечно, не входит в наши планы.
В следующем примере для поля ввода СчетДт типа ПланСчетовСсылка.Хозрасчетный
устанавливается отбор в виде списка счетов . Список счетов предварительно формируется с помощью запроса.
Код 1C v 8.х Процедура СчетДтНачалоВыбора(Элемент, СтандартнаяОбработка)
Запрос = Новый Запрос;
Запрос. Текст = "ВЫБРАТЬ
| Хозрасчетный.Ссылка
|ИЗ
| ПланСчетов.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Родитель В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы))
| И Хозрасчетный.ЗапретитьИспользоватьВПроводках = ЛОЖЬ" ;
СписокСчетов = Новый СписокЗначений;
СписокСчетов. ЗагрузитьЗначения( Запрос. Выполнить( ) . Выгрузить( ) . ВыгрузитьКолонку( "Ссылка" ) ) ;
ФормаВыбора = ПланыСчетов. Хозрасчетный. ПолучитьФормуВыбора( , Элемент) ;
ЭлементОтбораСсылка = ФормаВыбора. Отбор. Ссылка;
Если ЭлементОтбораСсылка < > Неопределено Тогда
ЭлементОтбораСсылка. ВидСравнения = ВидСравнения. ВСписке;
ЭлементОтбораСсылка. Значение = СписокСчетов;
ЭлементОтбораСсылка. Использование = Истина ;
КонецЕсли ;
ФормаВыбора. ЭлементыФормы. Список. НастройкаОтбора. Ссылка. Доступность = Ложь ;
ФормаВыбора. Открыть( ) ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
Использование выбора из списка:
Выбор значения
Перечисления обычно осуществляется из маленького списка. Но даже если включить выбор из формы (это делается с помощью свойства «Быстрый выбор» поля ввода), функционал отбора для перечислений все равно неприменим.
В таком случае подходящий способ ограничения списка выбора - использование метода формы ВыбратьИзСписка. Аналогично первому способу, необходимо определить процедуру обработки события НачалоВыбора для поля ввода значения. В следующем примере для поля ввода ВидПДР типа ПеречислениеСсылка.ВидыПрочихДоходовИРасходов программно устанавливается ограниченный список выбора.
Код 1C v 8.х Процедура ВидПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
ВидыПДР = Новый СписокЗначений;
ВидыПДР. Добавить( Перечисления. ВидыПрочихДоходовИРасходов. ПрочиеВнереализационныеДоходыРасходы) ;
ВидыПДР. Добавить( Перечисления. ВидыПрочихДоходовИРасходов. ПрочиеОперационныеДоходыРасходы) ;
ВыбранныйЭлемент = ВыбратьИзСписка( ВидыПДР, Элемент, ВидыПДР. НайтиПоЗначению( Элемент. Значение) ) ;
Если ВыбранныйЭлемент < > Неопределено Тогда
Элемент. Значение = ВыбранныйЭлемент. Значение;
КонецЕсли ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
Результат работы процедуры показан на рисунке. Метод ВыбратьИзСписка открывает маленький список с набором значений, переданных в процедуру в первом параметре (в примере - список значений ВидыПДР).
Пример ограничения списка выбора для перечисления в 1С 8
Пример для других агрегатных типов:
Код 1C v 8.х Процедура СчетКтНачалоВыбора(Элемент, СтандартнаяОбработка)
СчетаКт = Новый СписокЗначений;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. РасчетыСПоставщиками) ;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. РасчетыСПодотчетнымиЛицами) ;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. РасчетыСПрочимиПоставщикамиИПодрядчиками) ;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. РасчетыПоТекущимОперациям) ;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. ПрочиеДоходы) ;
ВыбранныйЭлемент = ВыбратьИзСписка( СчетаКт, Элемент, СчетаКт. НайтиПоЗначению( Элемент. Значение) ) ;
Если ВыбранныйЭлемент < > Неопределено Тогда
Элемент. Значение = ВыбранныйЭлемент. Значение;
КонецЕсли ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
Категория:
Работа с Формой (Диалог) и её элементами Как при выборе элемента справочника сделать отображение любого реквизита, а не код и наименование? Порой бывают ситуации когда необходимо выбрать в табличном поле элемента справочника, но отобразить его не как код или наименование, а как значение какого-либо реквизита!
НО Представление справочника это либо Код, либо Наименование и другого никак не выбрать - пойдем в обход добавив в ТабЧасть отдельный Реквизит(с типом строка, число, дата и т.д) и при выборе справочника запишем туда значение любого реквизита этого справочника!
Вот примеры реализации этого:
Вариант 1 (Создаем два реквизита Контрагент и ИНН):
И при выборе Контрагента, в колонке ИНН должно появится ИНН этого контрагента!
1. Создаем в Табличной части два Реквизита:
а. Наименование = СправочникСсылка.Контрагенты
б. ИНН = Строка 12 символов
2. После размещения этих реквизитов в табличной части на форме заходим в Свойства колонки Наименование
Добавляем Событие ПриИзменении и пишем в нем:
Код 1C v 8.х
Процедура ТабЧастьНаименованиеПриИзменении(Элемент)
ЭлементыФормы. ТабЧасть. ТекущаяСтрока. ИНН = Элемент. Значение. ИНН;
КонецПроцедуры
3. Сохраняем, проверям, наблюдаем
Вариант 2 (Создаем Один реквизит КПП и при нажатии на кнопку выбор должен открыться справочник контрагентов, далее выбрав контрагента, в поле должно попасть его КПП):
1. Создаем в Табличной части Реквизит:
КПП = Строка 9 символов
2. После размещения реквизита в табличной части на форме заходим в его Свойства
а. В разделе
Использование :
Ставим галочку - Кнопка Выбора
б. В разделе
События :
Добавляем НачалоВыбора и пишем код:
Код 1C v 8.х Процедура ТабЧастьКППНачалоВыбора(Элемент, СтандартнаяОбработка)
СпрКонтрагент = Справочники. Контрагенты. ПолучитьФормуВыбора( , ЭтаФорма) ;
СпрКонтрагент. Заголовок = "Выберите Поставщика:" ;
Выбор = СпрКонтрагент. ОткрытьМодально( ) ;
Элемент. Значение = Выбор. КПП;
КонецПроцедуры
3. Теперь щелкнув в колонке КПП, появится кнопка выбора |...|, нажав которую откроется справочник Контрагентов и выбрав Контрагента в поле появится его КПП.
Автор:
Мигачев Евгений Категория:
Справочники Как программно открыть и выбрать элемент справочника, выбор элемента справочника? Просто открыть:
Код 1C v 8.х
ФормаСписка = Справочники. Номенклатура. ПолучитьФормуСписка( , ЭтаФорма) ;
ФормаСписка. Открыть( ) ;
Открыть для выбора элемента:
Код 1C v 8.х ФормаВыбора = Справочники. Номенклатура. ПолучитьФормуВыбора( , ЭтаФорма) ;
ФормаВыбора. Заголовок = "Выберите товар!" ;
Выбрано = ФормаВыбора. ОткрытьМодально( ) ;
Открыть справочник для выбора элемента и установить отбор:
Код 1C v 8.х
Если Отобрать Тогда
ФормаВыбора = Справочники. ГруппыПользователей. ПолучитьФормуВыбора( ) ;
ФормаВыбора. Отбор. Ссылка. Установить( Справочники. ГруппыПользователей. ВсеПользователи) ;
ФормаВыбора. Отбор. Ссылка. ВидСравнения = ВидСравнения. НеРавно;
Иначе
ФормаВыбора = Справочники. Пользователи. ПолучитьФормуВыбора( ) ;
КонецЕсли ;
ФормаВыбора. ПараметрВыборГруппИЭлементов = ИспользованиеГруппИЭлементов. Элементы;
ВыбранноеЗначение = ФормаВыбора. ОткрытьМодально( ) ;
Примеры использования событий(Вывели на форму поле елемента справочника, в его свойствах есть события)
Код 1C v 8.х Процедура ПолеВводаНачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
ФормаВыбора = Справочники. Номенклатура. ПолучитьФормуВыбора( , Элемент) ;
ФормаВыбора. Открыть( ) ;
КонецПроцедуры
Процедура ПолеВводаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
ПолученноеЗначение = ВыбранноеЗначение;
КонецПроцедуры
Категория:
Справочники