Как в УТ 11.3, в справочник номенклатуры добавить остатки на складах и актуальные цены Попросил клиент добавить в справочник номенклатуры остатки и цены на текущий момент. Нужно!? Делаем:
1. Открываем форму списка номенклатуры и в свойства СписокНоменклатуры - Настройка списка
Корректируем запрос добавляя выборку по остаткам склада, новый вариант:
Код 1C v 8.3 ВЫБРАТЬ
СпрНоменклатура. Ссылка КАК Ссылка,
СпрНоменклатура. Код КАК Код,
СпрНоменклатура. Наименование КАК Наименование,
СпрНоменклатура. Артикул КАК Артикул,
СпрНоменклатура. ВидНоменклатуры КАК ВидНоменклатуры,
СпрНоменклатура. ЕдиницаИзмерения КАК ЕдиницаИзмерения,
СпрНоменклатура. СтавкаНДС КАК СтавкаНДС,
СпрНоменклатура. Родитель,
ВЫБОР
КОГДА СпрНоменклатура. ЕстьТоварыДругогоКачества
ТОГДА 4 + ВЫБОР
КОГДА СпрНоменклатура. ПометкаУдаления
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ + ВЫБОР
КОГДА СпрНоменклатура. ИспользованиеХарактеристик = ЗНАЧЕНИЕ( Перечисление. ВариантыИспользованияХарактеристикНоменклатуры. НеИспользовать)
ТОГДА 0
ИНАЧЕ 2
КОНЕЦ
ИНАЧЕ ВЫБОР
КОГДА СпрНоменклатура. ПометкаУдаления
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ + ВЫБОР
КОГДА СпрНоменклатура. ИспользованиеХарактеристик = ЗНАЧЕНИЕ( Перечисление. ВариантыИспользованияХарактеристикНоменклатуры. НеИспользовать)
ТОГДА 0
ИНАЧЕ 2
КОНЕЦ
КОНЕЦ КАК ИндексКартинки,
ТоварыНаСкладахОстатки1 . ВНаличииОстаток КАК Остаток_Про,
ТоварыНаСкладахОстатки2 . ВНаличииОстаток КАК Остаток_Лемм
ИЗ
Справочник. Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления. ТоварыНаСкладах. Остатки( ,
Склад = Склад1
) КАК ТоварыНаСкладахОстатки1
ПО ( ТоварыНаСкладахОстатки1 . Номенклатура = СпрНоменклатура. Ссылка)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления. ТоварыНаСкладах. Остатки( ,
Склад = Склад2
) КАК ТоварыНаСкладахОстатки2
ПО ( ТоварыНаСкладахОстатки2 . Номенклатура = СпрНоменклатура. Ссылка)
ГДЕ
НЕ СпрНоменклатура. ЭтоГруппа
{ГДЕ
( СпрНоменклатура. Ссылка В
( ВЫБРАТЬ
Сегменты. Номенклатура
ИЗ
РегистрСведений. НоменклатураСегмента КАК Сегменты
ГДЕ
Сегменты. Сегмент = СегментНоменклатуры) ) }
2. Устанавливаем параметры в Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Код 1C v 8.3 СписокНоменклатура. Параметры. УстановитьЗначениеПараметра( "Склад1" , Справочники. Склады. НайтиПоНаименованию( "PRO" ) ) ;
СписокНоменклатура. Параметры. УстановитьЗначениеПараметра( "Склад2" , Справочники. Склады. НайтиПоНаименованию( "ЛЕММ" ) ) ;
Цены. Параметры. УстановитьЗначениеПараметра( "КонПериода" , ТекущаяДата( ) ) ;
Добавляем Динамический список Цены:
В свойствах произвольный запрос:
Код 1C v 8.3 ВЫБРАТЬ РАЗРЕШЕННЫЕ
ЦеныНоменклатурыСрезПоследних. Номенклатура,
ЦеныНоменклатурыСрезПоследних. ВидЦены,
ЦеныНоменклатурыСрезПоследних. Характеристика,
ЦеныНоменклатурыСрезПоследних. Цена
ИЗ
РегистрСведений. ЦеныНоменклатуры. СрезПоследних( &КонПериода, ) КАК ЦеныНоменклатурыСрезПоследних
И для списка номенклатуры пропишем обновление цен при активизации строки
Код 1C v 8.3
Цены. Отбор. Элементы. Очистить( ) ;
НовыйЭлементОтбора = Цены. Отбор. Элементы. Добавить( Тип( "ЭлементОтбораКомпоновкиДанных" ) ) ;
ПолеОтбора = Новый ПолеКомпоновкиДанных( "Номенклатура" ) ;
НовыйЭлементОтбора. ЛевоеЗначение = ПолеОтбора;
НовыйЭлементОтбора. Использование = Истина ;
НовыйЭлементОтбора. ВидСравнения = ВидСравненияКомпоновкиДанных. Равно;
НовыйЭлементОтбора. ПравоеЗначение = ? ( Элемент. ТекущиеДанные < > Неопределено , Элемент. ТекущиеДанные. Ссылка, ВернутьЗначениеНоменклатура( ) ) ;
В результате:
Клиент доволен, а это самое главное
Если Вам нужна аналогичная настройка, обращайтесь, контакты тут
Категория:
1С Управление торговлей 11 Как отобразить дерево значений на управляемой форме Создадим новую внешнюю обработку.
Добавляем управляемую форму и создаем обработчик ПриСозданииНаСервере(). Никаких реквизитов и элементов “вручную” не добавляем, будем делать это программно.
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДеревоОбъект = Новый ДеревоЗначений;
ДеревоОбъект. Колонки. Добавить( "Узел" , Новый ОписаниеТипов( "Строка" ) ) ;
Для к1 = 1 По 3 Цикл
СтрокаУ1 = ДеревоОбъект. Строки. Добавить( ) ;
СтрокаУ1 . Узел = "Узел" + к1 ;
Для к2 = 1 По 3 Цикл
СтрокаУ2 = СтрокаУ1 . Строки. Добавить( ) ;
СтрокаУ2 . Узел = СтрокаУ1 . Узел+ к2 ;
Для к3 = 1 По 3 Цикл
СтрокаУ3 = СтрокаУ2 . Строки. Добавить( ) ;
СтрокаУ3 . Узел = СтрокаУ2 . Узел+ к3 ;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов. Добавить( Новый РеквизитФормы( "Дерево" ,
Новый ОписаниеТипов( "ДеревоЗначений" ) ) ) ;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
МассивДобавляемыхРеквизитов. Добавить(
Новый РеквизитФормы( Колонка. Имя, Колонка. ТипЗначения, "Дерево" ) ) ;
КонецЦикла ;
ИзменитьРеквизиты( МассивДобавляемыхРеквизитов) ;
ЗначениеВРеквизитФормы( ДеревоОбъект, "Дерево" ) ;
ЭлементДерево = Элементы. Добавить( "Дерево" , Тип( "ТаблицаФормы" ) ) ;
ЭлементДерево. ПутьКДанным = "Дерево" ;
ЭлементДерево. Отображение = ОтображениеТаблицы. Дерево;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
НовыйЭлемент = Элементы. Добавить( Колонка. Имя, Тип( "ПолеФормы" ) ,
ЭлементДерево) ;
НовыйЭлемент. Вид = ВидПоляФормы. ПолеВвода;
НовыйЭлемент. ПутьКДанным = "Дерево." + Колонка. Имя;
КонецЦикла ;
КонецПроцедуры
Категория:
Работа с Деревом Значений Как программно установить отбор в СКД Код 1C v 8.х Процедура ВашРеквизитПриИзменении(Элемент)
СоответствиеПоискаОтбора = Новый Соответствие;
СоответствиеПоискаОтбора.Вставить("ЛевоеЗначение",Новый ПолеКомпоновкиДанных("%Нужное поле компоновки%"));
СоответствиеПоискаОтбора.Вставить("ВидСравнения",ВидСравненияКомпоновкиДанных.ВСписке); //сюда впихнуть нужный вид сравнения
СоответствиеПоискаОтбора.Вставить("Использование",Истина);
СоответствиеНовогоОтбора = Новый Соответствие;
СоответствиеНовогоОтбора.Вставить("ЛевоеЗначение",Новый ПолеКомпоновкиДанных("%Нужное поле компоновки%"));
СоответствиеНовогоОтбора.Вставить("ВидСравнения",ВидСравненияКомпоновкиДанных.ВСписке); // вид сравнения
Если ЗначениеЗаполнено(Кампейны) тогда
СоответствиеНовогоОтбора.Вставить("Использование",Истина);
Иначе
СоответствиеНовогоОтбора.Вставить("Использование",Ложь);
КонецЕсли;
СоответствиеНовогоОтбора.Вставить("Значение",Кампейны);
ИзменитьОтбор(КомпоновщикНастроек,СоответствиеПоискаОтбора,СоответствиеНовогоОтбора);
КонецПроцедуры
Процедура ИзменитьОтбор(ЭлементСтруктуры, СоответствиеПоискаОтбора = Неопределено, СоответствиеНовогоОтбора) Экспорт
Если ТипЗнч(ЭлементСтруктуры) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
Отбор = ЭлементСтруктуры.Настройки.Отбор;
Иначе
Отбор = ЭлементСтруктуры;
КонецЕсли;
Если ТипЗнч(СоответствиеНовогоОтбора["ЛевоеЗначение"]) = Тип("Строка") Тогда
нПоле = Новый ПолеКомпоновкиДанных(СоответствиеНовогоОтбора.ЛевоеЗначение);
Иначе
нПоле = СоответствиеНовогоОтбора["ЛевоеЗначение"];
КонецЕсли;
Если СоответствиеНовогоОтбора.Получить("ВидСравнения") = Неопределено Тогда
нВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Иначе
нВидСравнения = СоответствиеНовогоОтбора["ВидСравнения"];
КонецЕсли;
Если СоответствиеНовогоОтбора.Получить("Использование") = Неопределено Тогда
нИспользование = Истина;
Иначе
нИспользование = СоответствиеНовогоОтбора["Использование"];
КонецЕсли;
нЗначение = СоответствиеНовогоОтбора["Значение"];
ТолькоПоЛевомуЗначению = Ложь;
Если СоответствиеПоискаОтбора = Неопределено Тогда
ТолькоПоЛевомуЗначению = Истина;
КонецЕсли;
сЛевоеЗначение = СоответствиеПоискаОтбора.Получить("ЛевоеЗначение");
Если сЛевоеЗначение = Неопределено Тогда
сЛевоеЗначение = нПоле;
КонецЕсли;
сВидСравнения = СоответствиеПоискаОтбора.Получить("ВидСравнения");
Если ВидСравнения = Неопределено Тогда
сВидСравнения = ВидСравнения;
КонецЕсли;
сИспользование = СоответствиеПоискаОтбора.Получить("Использование");
Если сИспользование = Неопределено Тогда
сИспользование = нИспользование;
КонецЕсли;
Для каждого ЭлементОтбора Из Отбор.Элементы Цикл
Если ТолькоПоЛевомуЗначению Тогда
НайденныйОтбор = ЭлементОтбора;
Прервать;
Иначе
Если (ЭлементОтбора.ЛевоеЗначение = сЛевоеЗначение)
И (ЭлементОтбора.ВидСравнения = сВидСравнения)
Тогда
НайденныйОтбор = ЭлементОтбора;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если НайденныйОтбор <> Неопределено Тогда
НайденныйОтбор.ЛевоеЗначение = нПоле;
НайденныйОтбор.Использование = нИспользование;
НайденныйОтбор.ВидСравнения = нВидСравнения;
НайденныйОтбор.ПравоеЗначение = нЗначение;
Иначе
НовыйЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ПолеОтбора = Новый ПолеКомпоновкиДанных(нПоле);
НовыйЭлементОтбора.ЛевоеЗначение = нПоле;
НовыйЭлементОтбора.Использование = нИспользование;
НовыйЭлементОтбора.ВидСравнения = нВидСравнения;
НовыйЭлементОтбора.ПравоеЗначение = нЗначение;
КонецЕсли;
КонецПроцедуры
Категория:
Схема Компоновки Данных Фунции отвечающие за обмен данных с формой на сервере. РеквизитФормыВЗначение - Преобразует указанный реквизит формы в объект прикладного типа.
Код 1C v 8.2 УП &НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
ДокументОбъект = РеквизитФормыВЗначение( "Объект" ) ;
ПеречитатьДанныеПоСертификатам( ДокументОбъект) ;
КонецПроцедуры
ЗначениеВРеквизитФормы – Преобразует объект прикладного типа в реквизит управляемой формы
Код 1C v 8.2 УП
&НаСервере
Процедура ПриИзмененииПартнераСервер()
СправочникОбъект = РеквизитФормыВЗначение( "Объект" ) ;
СправочникОбъект. ЗаполнитьУсловияПродажПоУмолчанию( ) ;
ЗначениеВРеквизитФормы( СправочникОбъект, "Объект" ) ;
УстановитьВидимостьЭлементовПоРегулярностиСервер( ) ;
КонецПроцедуры
ДанныеФормыВЗначение – Преобразует данные формы в объект прикладного типа.
Код 1C v 8.2 УП &НаСервере
Функция НовыйЭлементСправочника()
СправочникОбъект = ДанныеФормыВЗначение( Объект, Тип( "СправочникОбъект.Номенклатура" ) ) ;
СправочникОбъект. Записать( ) ;
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
ЗначениеВДанныеФормы – Преобразует объект прикладного типа в универсальный объект данных.
Код 1C v 8.2 УП &НаСервере
Процедура НовыйЧекНаСервере()
НовыйЧек = Документы. ЧекККМ. СоздатьДокумент( ) ;
НовыйЧек. Партнер = Справочники. Партнеры. РозничныйПокупатель;
НовыйЧек. ОбработкаЗаполнения( Новый Структура( "КассаККМ" , Объект. КассаККМ) , Истина ) ;
ЗначениеВДанныеФормы( НовыйЧек, Объект) ;
Категория:
Управляемое приложение, Тонкий клиент Примеры работы с Деревом значений в УП Так как работа с ДеревомЗначений и ТаблицейЗначений в данном контексте практически не отличается, в примере будет использоваться ДеревоЗначений, все тоже самое за исключением иерархии применимо и к ТаблицеЗначений. Как известно, в
платформе 1С 8.1 не составляло никакого труда связать дерево значений с табличным полем на форме, единственное что при этом нужно было не забыть так это СоздатьКолонки() .
В управляемом приложении 1С 8.2 сделать это не так просто как кажется на первый взгляд.
Обращаю внимание, что
ДеревоЗначений доступно только на сервере, в толстом клиенте и внешнем соединение. В данных самой управляемой формы для моделирования дерева используется тип ДанныеФормыДерево. Для преобразования ДеревоЗначений <-> ДанныеФормыДерево используются методы управляемой формы ЗначениеВРеквизитФормы() и РеквизитФормыВЗначение(). Для непосредственного отображения дерева используется элемент формы типа ТаблицаФормы связанный через реквизит ПутьКДанным с реквизитом формы типа ДанныеФормыДерево. Если Вам не очень понятна вышеописанная связь объектов, не огорчайтесь, ниже рассмотрим практический пример и все встанет на свои места.
Задача: Имеется дерево значений, необходимо отобразить его на управляемой форме.
Создаем новую внешнюю обработку (
Скачивать файлы может только зарегистрированный пользователь! ), добавляем управляемую форму и создаем обработчик ПриСозданииНаСервере(). Никаких реквизитов и элементов “вручную” не добавляем, будем делать это программно.
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДеревоОбъект = Новый ДеревоЗначений;
ДеревоОбъект. Колонки. Добавить( "Узел" , Новый ОписаниеТипов( "Строка" ) ) ;
Для к1 = 1 По 3 Цикл
СтрокаУ1 = ДеревоОбъект. Строки. Добавить( ) ;
СтрокаУ1 . Узел = "Узел" + к1 ;
Для к2 = 1 По 3 Цикл
СтрокаУ2 = СтрокаУ1 . Строки. Добавить( ) ;
СтрокаУ2 . Узел = СтрокаУ1 . Узел+ к2 ;
Для к3 = 1 По 3 Цикл
СтрокаУ3 = СтрокаУ2 . Строки. Добавить( ) ;
СтрокаУ3 . Узел = СтрокаУ2 . Узел+ к3 ;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов. Добавить( Новый РеквизитФормы( "Дерево" ,
Новый ОписаниеТипов( "ДеревоЗначений" ) ) ) ;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
МассивДобавляемыхРеквизитов. Добавить(
Новый РеквизитФормы( Колонка. Имя, Колонка. ТипЗначения, "Дерево" ) ) ;
КонецЦикла ;
ИзменитьРеквизиты( МассивДобавляемыхРеквизитов) ;
ЗначениеВРеквизитФормы( ДеревоОбъект, "Дерево" ) ;
ЭлементДерево = Элементы. Добавить( "Дерево" , Тип( "ТаблицаФормы" ) ) ;
ЭлементДерево. ПутьКДанным = "Дерево" ;
ЭлементДерево. Отображение = ОтображениеТаблицы. Дерево;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
НовыйЭлемент = Элементы. Добавить( Колонка. Имя, Тип( "ПолеФормы" ) ,
ЭлементДерево) ;
НовыйЭлемент. Вид = ВидПоляФормы. ПолеВвода;
НовыйЭлемент. ПутьКДанным = "Дерево." + Колонка. Имя;
КонецЦикла ;
КонецПроцедуры
Механизм Drag and D_rop (или проще говоря “Перетаскивания”) для ДереваЗначений расположенного на управляемой форме управляемого приложения
Основная сложность реализации механизма перетаскивания заключается в том, что у строки ДереваЗначений платформа не позволяет просто изменить родителя, т.е. переподчинить строку. Единственный способ это сделать – создать новую строку вместе со всеми подчиненными строками, т.е. полностью скопировать всю ветку дерева вместе со всей иерархией и подчинить ее требуемой строке-родителю, после чего удалить исходную ветку. Данная задача распадается на две подзадачи:
1). Перед перетаскиванием необходимо проверить корректность данной операции, узел дерева нельзя переносить в узлы подчиненные ему самому, т.е. родительский узел нельзя переносить в дочерние, т.к. это приведет к “бесконечной рекурсии” и “падению” платформы. Это реализуется с помощью обработчика события ЭлементДеревоПроверкаПеретаскивания(…)
2). Если перетаскивание возможно, то при помощи обработчика ЭлементДеревоПеретаскивание(…) запускается рекурсивная функция, которая создает новую ветку дерева, подчиненную требуемому родителю, а исходную удаляет.
Обращаю особое внимание на то, что в платформе 8.2 реализован механизм множественного выбора элементов, поэтому вышеуказанные операции необходимо произвести для всех выбранных пользователем элементов. (
Скачивать файлы может только зарегистрированный пользователь! )
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭлементДерево. МножественныйВыбор= Истина ;
ЭлементДерево. РазрешитьПеретаскивание= Истина ;
ЭлементДерево. РазрешитьНачалоПеретаскивания= Истина ;
ЭлементДерево. УстановитьДействие( "ПроверкаПеретаскивания" ,
"ЭлементДеревоПроверкаПеретаскивания" ) ;
ЭлементДерево. УстановитьДействие( "Перетаскивание" ,
"ЭлементДеревоПеретаскивание" ) ;
КонецПроцедуры
&НаКлиенте
Функция ПроверитьВозможностьПереноса(ПереносимыйЭлемент, Знач НовыйРодитель)
Пока НЕ НовыйРодитель = Неопределено Цикл
Если ПереносимыйЭлемент = НовыйРодитель Тогда
Возврат Ложь ;
КонецЕсли ;
НовыйРодитель = НовыйРодитель. ПолучитьРодителя( ) ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
&НаКлиенте
Функция СкопироватьСтрокуДерева(РеквизитДерево, Приемник, Источник)
Перем НоваяСтрока, ОбратныйИндекс, КолПодчиненныхСтрок;
Если Источник = Неопределено Тогда
Возврат Неопределено ;
КонецЕсли ;
Если Приемник = Неопределено Тогда
НоваяСтрока = РеквизитДерево. ПолучитьЭлементы( ) . Добавить( ) ;
Иначе
НоваяСтрока = Приемник. ПолучитьЭлементы( ) . Добавить( ) ;
КонецЕсли ;
ЗаполнитьЗначенияСвойств( НоваяСтрока, Источник) ;
КолПодчиненныхСтрок = Источник. ПолучитьЭлементы( ) . Количество( ) ;
Для ОбратныйИндекс = 1 По КолПодчиненныхСтрок Цикл
ПодчиненнаяСтрока = Источник. ПолучитьЭлементы( )
[КолПодчиненныхСтрок - ОбратныйИндекс];
СкопироватьСтрокуДерева( РеквизитДерево, НоваяСтрока, ПодчиненнаяСтрока) ;
КонецЦикла ;
Если Источник. ПолучитьРодителя( ) = Неопределено Тогда
РеквизитДерево. ПолучитьЭлементы( ) . Удалить( Источник) ;
Иначе
Источник. ПолучитьРодителя( ) . ПолучитьЭлементы( ) . Удалить( Источник) ;
КонецЕсли ;
Возврат НоваяСтрока;
КонецФункции
&НаКлиенте
Процедура ЭлементДеревоПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания,
СтандартнаяОбработка, Строка, Поле)
СтандартнаяОбработка = Ложь ;
РеквизитДерево = ЭтаФорма["Дерево" ];
ИДНовыйРодитель = Строка;
НовыйРодитель = ? ( ИДНовыйРодитель = Неопределено , Неопределено ,
РеквизитДерево. НайтиПоИдентификатору( ИДНовыйРодитель) ) ;
МассивИДПереносимыхЭлементов = ПараметрыПеретаскивания. Значение;
Для каждого ИДПереносимыйЭлемент из МассивИДПереносимыхЭлементов Цикл
ПереносимыйЭлемент = РеквизитДерево. НайтиПоИдентификатору(
ИДПереносимыйЭлемент) ;
Если НЕ ПроверитьВозможностьПереноса( ПереносимыйЭлемент,
НовыйРодитель) Тогда
ПараметрыПеретаскивания. Действие= ДействиеПеретаскивания. Отмена;
Прервать ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Процедура ЭлементДеревоПеретаскивание(Элемент, ПараметрыПеретаскивания,
СтандартнаяОбработка, Строка, Поле)
СтандартнаяОбработка= Ложь ;
РеквизитДерево = ЭтаФорма["Дерево" ];
ИДПриемник = Строка;
Приемник = ? ( ИДПриемник = Неопределено , Неопределено ,
РеквизитДерево. НайтиПоИдентификатору( ИДПриемник) ) ;
МассивИДИсточник = ПараметрыПеретаскивания. Значение;
Для Каждого ИДИсточник Из МассивИДИсточник Цикл
Источник = РеквизитДерево. НайтиПоИдентификатору( ИДИсточник) ;
НоваяСтрока = СкопироватьСтрокуДерева( РеквизитДерево, Приемник, Источник) ;
Если Приемник = Неопределено и НоваяСтрока< > Неопределено Тогда
Элементы["Дерево" ]. Развернуть( НоваяСтрока. ПолучитьИдентификатор( ) ,
Истина ) ;
КонецЕсли ;
КонецЦикла ;
Если НЕ Приемник = Неопределено Тогда
Элементы["Дерево" ]. Развернуть( ИДПриемник, Истина ) ;
КонецЕсли ;
КонецПроцедуры
Реализовать трехпозиционный флажок в ДеревеЗначений на управляемой форме
который работает по следующему алгоритму:
* Если у элемента ДереваЗначений нет подчиненных элементов, то флажок может быть либо “включен”, либо “выключен”.
* Если у элемента есть подчиненные, то флажок “включен”, если ВКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов, “выключен” если ВЫКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов.
Если у некоторых подчиненных элементов флажки включены, а у некоторых выключены, то флажок родительского элемента имеет значение “неопределенно”.
* При включении флажка у родительского элемента, включаются флажки ВСЕХ подчиненных, при выключении флажка у родительского элемента, выключаются флажки ВСЕХ подчиненных.
Возьмем из первой статьи процедуру построения дерева значений и доработаем ее, добавив в дерево еще одну колонку, которая будет содержать элемент управления флажок и реализуем для него обработчик события “ПриИзменении”. Весь алгоритм сводится к обработке изменения флажка: у всех подчиненных элементов необходимо включить/выключить флажки в зависимости от состояния флажка текущего элемента, а у всех родителей текущего элемента (которые расположены на верхних уровнях иерархии) проставить флажки в состояния “включен”/”выключен”/”неопределенно” в соответствии с вышеописанным алгоритмом. (
Скачивать файлы может только зарегистрированный пользователь! )
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДеревоОбъект = Новый ДеревоЗначений;
ДеревоОбъект. Колонки. Добавить( "Узел" , Новый ОписаниеТипов( "Строка" ) ) ;
ДеревоОбъект. Колонки. Добавить( "Пометка" , Новый ОписаниеТипов( "Число" ) ) ;
Для к1 = 1 По 3 Цикл
СтрокаУ1 = ДеревоОбъект. Строки. Добавить( ) ;
СтрокаУ1 . Узел = "Узел" + к1 ;
Для к2 = 1 По 3 Цикл
СтрокаУ2 = СтрокаУ1 . Строки. Добавить( ) ;
СтрокаУ2 . Узел = СтрокаУ1 . Узел+ к2 ;
Для к3 = 1 По 3 Цикл
СтрокаУ3 = СтрокаУ2 . Строки. Добавить( ) ;
СтрокаУ3 . Узел = СтрокаУ2 . Узел+ к3 ;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов. Добавить( Новый РеквизитФормы( "Дерево" ,
Новый ОписаниеТипов( "ДеревоЗначений" ) ) ) ;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
МассивДобавляемыхРеквизитов. Добавить( Новый РеквизитФормы( Колонка. Имя,
Колонка. ТипЗначения, "Дерево" ) ) ;
КонецЦикла ;
ИзменитьРеквизиты( МассивДобавляемыхРеквизитов) ;
ЗначениеВРеквизитФормы( ДеревоОбъект, "Дерево" ) ;
ЭлементДерево = Элементы. Добавить( "Дерево" , Тип( "ТаблицаФормы" ) ) ;
ЭлементДерево. ПутьКДанным = "Дерево" ;
ЭлементДерево. Отображение = ОтображениеТаблицы. Дерево;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
НовыйЭлемент = Элементы. Добавить( Колонка. Имя, Тип( "ПолеФормы" ) ,
ЭлементДерево) ;
НовыйЭлемент. ПутьКДанным = "Дерево." + Колонка. Имя;
Если НЕ Колонка. Имя = "Пометка" Тогда
НовыйЭлемент. Вид = ВидПоляФормы. ПолеВвода;
Иначе
НовыйЭлемент. Вид = ВидПоляФормы. ПолеФлажка;
НовыйЭлемент. ТриСостояния = Истина ;
НовыйЭлемент. УстановитьДействие( "ПриИзменении" ,
"ФлажокПриИзменении" ) ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Процедура ФлажокПриИзменении(Элемент)
ИДТекущейСтроки = Элементы["Дерево" ]. ТекущаяСтрока;
Если ИДТекущейСтроки < > Неопределено Тогда
ЭлементКоллекции = ЭтаФорма["Дерево" ]. НайтиПоИдентификатору(
ИДТекущейСтроки) ;
Если ЭлементКоллекции. Пометка = 2 Тогда
ЭлементКоллекции. Пометка = 0 ;
КонецЕсли ;
УстановкаФлажков( ЭлементКоллекции, ЭлементКоллекции. Пометка) ;
Родитель = ЭлементКоллекции. ПолучитьРодителя( ) ;
Пока Родитель < > Неопределено Цикл
Родитель. Пометка = ? ( УстановленноДляВсех( ЭлементКоллекции) ,
ЭлементКоллекции. Пометка, 2 ) ;
ЭлементКоллекции = Родитель;
Родитель = ЭлементКоллекции. ПолучитьРодителя( ) ;
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура УстановкаФлажков(ЭлементКоллекции, ЗначениеПометки)
ПодчинЭлементы = ЭлементКоллекции. ПолучитьЭлементы( ) ;
Для Каждого ТекЭлемент Из ПодчинЭлементы Цикл
ТекЭлемент. Пометка = ЗначениеПометки;
УстановкаФлажков( ТекЭлемент, ТекЭлемент. Пометка) ;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Функция УстановленноДляВсех(ЭлементКоллекции)
СоседниеЭлементы =
ЭлементКоллекции. ПолучитьРодителя( ) . ПолучитьЭлементы( ) ;
Для Каждого ТекЭлемент Из СоседниеЭлементы Цикл
Если ТекЭлемент. Пометка < > ЭлементКоллекции. Пометка Тогда
Возврат Ложь ;
КонецЕсли ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
Источник Категория:
Работа с Деревом Значений Как выгрузить журнал регистрации в XML-формате? Код 1C v 8.х ВыгрузитьЖурналРегистрации( "C:\log.xml" ) ;
Пользователи = ПользователиИнформационнойБазы. ПолучитьПользователей( ) ;
Для Каждого Пользователь из Пользователи Цикл
НовыйЭлемент = СписокПользователей. Добавить( ) ;
НовыйЭлемент. Пометка = Истина ;
НовыйЭлемент. Значение = Пользователь;
НовыйЭлемент. Представление = Пользователь. Имя;
КонецЦикла ;
Массив = Новый Массив;
Для Каждого Пользователь Из СписокПользователей Цикл
Если Пользователь. Пометка Тогда
Массив. Добавить( Пользователь) ;
КонецЕсли ;
КонецЦикла ;
СтруктураФильтра = Новый Структура;
СтруктураФильтра. Вставить( "Пользователь" , Массив) ;
ВыгрузитьЖурналРегистрации( "C:\log.xml" , СтруктураФильтра, "Дата, Пользователь, ПредставлениеСобытия" ) ;
Категория:
Встроенные Функции Табличное поле ~ Как реализовать в дереве значений флажок с тремя состояниями? 8.2 УП
Необходимо реализовать трехпозиционный флажок в ДеревеЗначений на управляемой форме 1С предприятия 8.2 , который работает по следующему алгоритму:
* Если у элемента ДереваЗначений нет подчиненных элементов, то флажок может быть либо “включен”, либо “выключен”.
* Если у элемента есть подчиненные, то флажок “включен”, если ВКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов, “выключен” если ВЫКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов.
Если у некоторых подчиненных элементов флажки включены, а у некоторых выключены, то флажок родительского элемента имеет значение “неопределенно”.
* При включении флажка у родительского элемента, включаются флажки ВСЕХ подчиненных, при выключении флажка у родительского элемента, выключаются флажки ВСЕХ подчиненных.
Возьмем из первой статьи процедуру построения дерева значений и доработаем ее, добавив в дерево еще одну колонку, которая будет содержать элемент управления флажок и реализуем для него обработчик события “ПриИзменении”. Весь алгоритм сводится к обработке изменения флажка: у всех подчиненных элементов необходимо включить/выключить флажки в зависимости от состояния флажка текущего элемента, а у всех родителей текущего элемента (которые расположены на верхних уровнях иерархии) проставить флажки в состояния “включен”/”выключен”/”неопределенно” в соответствии с вышеописанным алгоритмом. Пример -
Скачивать файлы может только зарегистрированный пользователь!
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДеревоОбъект = Новый ДеревоЗначений;
ДеревоОбъект. Колонки. Добавить( "Узел" , Новый ОписаниеТипов( "Строка" ) ) ;
ДеревоОбъект. Колонки. Добавить( "Пометка" , Новый ОписаниеТипов( "Число" ) ) ;
Для к1 = 1 По 3 Цикл
СтрокаУ1 = ДеревоОбъект. Строки. Добавить( ) ;
СтрокаУ1 . Узел = "Узел" + к1 ;
Для к2 = 1 По 3 Цикл
СтрокаУ2 = СтрокаУ1 . Строки. Добавить( ) ;
СтрокаУ2 . Узел = СтрокаУ1 . Узел+ к2 ;
Для к3 = 1 По 3 Цикл
СтрокаУ3 = СтрокаУ2 . Строки. Добавить( ) ;
СтрокаУ3 . Узел = СтрокаУ2 . Узел+ к3 ;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов. Добавить( Новый РеквизитФормы( "Дерево" ,
Новый ОписаниеТипов( "ДеревоЗначений" ) ) ) ;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
МассивДобавляемыхРеквизитов. Добавить( Новый РеквизитФормы( Колонка. Имя,
Колонка. ТипЗначения, "Дерево" ) ) ;
КонецЦикла ;
ИзменитьРеквизиты( МассивДобавляемыхРеквизитов) ;
ЗначениеВРеквизитФормы( ДеревоОбъект, "Дерево" ) ;
ЭлементДерево = Элементы. Добавить( "Дерево" , Тип( "ТаблицаФормы" ) ) ;
ЭлементДерево. ПутьКДанным = "Дерево" ;
ЭлементДерево. Отображение = ОтображениеТаблицы. Дерево;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
НовыйЭлемент = Элементы. Добавить( Колонка. Имя, Тип( "ПолеФормы" ) ,
ЭлементДерево) ;
НовыйЭлемент. ПутьКДанным = "Дерево." + Колонка. Имя;
Если НЕ Колонка. Имя = "Пометка" Тогда
НовыйЭлемент. Вид = ВидПоляФормы. ПолеВвода;
Иначе
НовыйЭлемент. Вид = ВидПоляФормы. ПолеФлажка;
НовыйЭлемент. ТриСостояния = Истина ;
НовыйЭлемент. УстановитьДействие( "ПриИзменении" ,
"ФлажокПриИзменении" ) ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Процедура ФлажокПриИзменении(Элемент)
ИДТекущейСтроки = Элементы["Дерево" ]. ТекущаяСтрока;
Если ИДТекущейСтроки < > Неопределено Тогда
ЭлементКоллекции = ЭтаФорма["Дерево" ]. НайтиПоИдентификатору(
ИДТекущейСтроки) ;
Если ЭлементКоллекции. Пометка = 2 Тогда
ЭлементКоллекции. Пометка = 0 ;
КонецЕсли ;
УстановкаФлажков( ЭлементКоллекции, ЭлементКоллекции. Пометка) ;
Родитель = ЭлементКоллекции. ПолучитьРодителя( ) ;
Пока Родитель < > Неопределено Цикл
Родитель. Пометка = ? ( УстановленноДляВсех( ЭлементКоллекции) ,
ЭлементКоллекции. Пометка, 2 ) ;
ЭлементКоллекции = Родитель;
Родитель = ЭлементКоллекции. ПолучитьРодителя( ) ;
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура УстановкаФлажков(ЭлементКоллекции, ЗначениеПометки)
ПодчинЭлементы = ЭлементКоллекции. ПолучитьЭлементы( ) ;
Для Каждого ТекЭлемент Из ПодчинЭлементы Цикл
ТекЭлемент. Пометка = ЗначениеПометки;
УстановкаФлажков( ТекЭлемент, ТекЭлемент. Пометка) ;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Функция УстановленноДляВсех(ЭлементКоллекции)
СоседниеЭлементы =
ЭлементКоллекции. ПолучитьРодителя( ) . ПолучитьЭлементы( ) ;
Для Каждого ТекЭлемент Из СоседниеЭлементы Цикл
Если ТекЭлемент. Пометка < > ЭлементКоллекции. Пометка Тогда
Возврат Ложь ;
КонецЕсли ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
8.х
На форме имеется табличное поле, источником данных для которого является дерево значений. В одной из колонок расположен элемент управления «Флажок». Необходимо что бы он мог принимать три состояния «Включен», «Выключен» и «Неопределено». При этом состояние «Неопределено» или так называемый «серый флажок», т.е. выбранный частично, устанавливается в том случае, если не у всех подчиненных строк состояние флажка одинаковое. Так же если строка имеет подчиненные строки, то при изменении её флажка, соответствующим образом должны изменяться флажки и всех подчиненных строк.
Во-первых, добавим нашу колонку с флажком в дерево значений:
Код 1C v 8.х Дерево. Колонки. Добавить( "Пометка" , Новый ОписаниеТипов( "Число" ) ) ;
ЭлементыФормы. Дерево. СоздатьКолонки( ) ;
КолонкиДерева= ЭлементыФормы. Дерево. Колонки;
КолонкиДерева. Пометка. ДанныеФлажка= "Пометка" ;
КолонкиДерева. Пометка. УстановитьЭлементУправления( Тип( "Флажок" ) ) ;
КолонкиДерева. Пометка. РежимРедактирования= РежимРедактированияКолонки. Непосредственно;
КолонкиДерева. Пометка. ТриСостоянияФлажка= Истина ;
Во-вторых, при изменении флажка нужно устанавливать соответствующие значения в подчиненных строках и контролировать значение флажка в «строке-родителе»:
Код 1C v 8.х Процедура ДеревоПриИзмененииФлажка(Элемент, Колонка)
ТекущаяСтрока= Элемент. ТекущаяСтрока;
Если ТекущаяСтрока. Пометка= 2 Тогда
ТекущаяСтрока. Пометка= 0 ;
КонецЕсли ;
УстановкаФлажков( ТекущаяСтрока, ТекущаяСтрока. Пометка) ;
Пока ТекущаяСтрока. Родитель< > Неопределено Цикл
ТекущаяСтрока. Родитель. Пометка= ? ( УстановленноДляВсех( ТекущаяСтрока) , ТекущаяСтрока. Пометка, 2 ) ;
ТекущаяСтрока= ТекущаяСтрока. Родитель;
КонецЦикла ;
КонецПроцедуры
Здесь процедура УстановкаФлажков() рекурсивно устанавливает флажки в подчиненных строках:
Код 1C v 8.х Процедура УстановкаФлажков(ТекущаяСтрока,Значение)
Для Каждого Стр Из ТекущаяСтрока. Строки Цикл
Стр. Пометка= Значение;
УстановкаФлажков( Стр, Стр. Пометка) ;
КонецЦикла ;
КонецПроцедуры
А функция УстановленноДляВсех() проверяет установлено ли одинаковое значение для всех строк на текущем уровне:
Код 1C v 8.х Функция УстановленноДляВсех(Строка)
Для Каждого Стр Из Строка. Родитель. Строки Цикл
Если Стр. Пометка< > Строка. Пометка Тогда
Возврат Ложь ;
КонецЕсли ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
Категория:
Работа с Формой (Диалог) и её элементами Как добавить отбор в отчете СКД программно Код 1C v 8.х НовыйЭлементОтбора = КомпоновщикНастроек. Настройки. Отбор. Элементы. Добавить( Тип( "ЭлементОтбораКомпоновкиДанных" ) ) ;
ПолеОтбора = Новый ПолеКомпоновкиДанных( "ИмяПоляКомпановки" ) ;
НовыйЭлементОтбора. ЛевоеЗначение = ПолеОтбора;
НовыйЭлементОтбора. Использование = Истина ;
НовыйЭлементОтбора. ВидСравнения = ВидСравненияКомпоновкиДанных. Равно;
НовыйЭлементОтбора. ПравоеЗначение = Значение;
Автор:
also Категория:
Схема Компоновки Данных Создание и запись нового элемента справочника Код 1C v 8.2 УП &НаКлиенте
Процедура ПоКнопкеНовыйКонтрагент(Команда)
Перем НовыйКонтрагент;
НовыйКонтрагент = Новый Структура( "Наименование, ПолноеНаименование, ИНН" ) ;
НовыйКонтрагент. Наименование = "РиК ООО" ;
НовыйКонтрагент. ПолноеНаименование = "ООО Рога и копыта" ;
НовыйКонтрагент. ИНН = "123456789012" ;
Если СоздатьНовогоКонтрагента( НовыйКонтрагент) = 0 Тогда
Сообщить( "Не удалось создать нового контрагента" ) ;
КонецЕсли ;
КонецПроцедуры
&НаСервере
Функция СоздатьНовогоКонтрагента(СтруктураСправочника)
Перем НовыйКонтрагент, СпрПользователи;
СпрКонтрагенты = Справочники. Контрагенты;
НовыйКонтрагент = СпрКонтрагенты. СоздатьЭлемент( ) ;
НовыйКонтрагент. Наименование = СтруктураСправочника. Наименование;
НовыйКонтрагент. ПолноеНаименование = СтруктураСправочника. ПолноеНаименование;
НовыйКонтрагент. ИНН = СтруктураСправочника. ИНН;
Попытка
НовыйКонтрагент. Записать( ) ;
Возврат 1 ;
Исключение
Возврат 0 ;
КонецПопытки ;
КонецФункции
Код 1C v 8.х
НовыйЭлемент = Справочники. Контрагенты. СоздатьЭлемент( ) ;
НовыйЭлемент. Наименование = "ООО Березка" ;
НовыйЭлемент. Записать( ) ;
НовыйЭлемент = Справочники. Банки. СоздатьЭлемент( ) ;
Родитель = Справочники. Банки. НайтиПоКоду( "000000001" ) ;
НовыйЭлемент. Наименование = "ВТБ" ;
НовыйЭлемент. Код = "000000011" ;
НовыйЭлемент. Родитель = Родитель;
НовыйЭлемент. Записать( ) ;
СпрСотр = Справочники. Сотрудники;
НовЭл = СпрСотр. СоздатьЭлемент( ) ;
НовЭл. Наименование = "Иванов Иван Иванович" ;
НовЭл. Оклад = 100 ;
НовЭл. Записать( ) ;
Код 1C v 7.x
спр = создатьОбъект( "Справочник.Контрагенты" ) ;
спр. Новый( ) ;
спр. Наименование = "ООО Березка" ;
спр. УстановитьНовыйКод( ) ;
спр. Записать( ) ;
СпрСотр = СоздатьОбъект( "Справочник.Сотрудники" ) ;
СпрСотр. Новый( ) ;
СпрСотр. Наименование = "Иванов Иван Иванович" ;
СпрСотр. Оклад = 100 ;
СпрСотр. Записать( ) ;
Категория:
Справочники