Табличное поле ~ Как установить значения для новой строки При добавлении новой строки нужно заполнить дату добавления и имя пользователя!
Добавлена строка может быть или кнопкой INS (добавление) или кнопкой F9 (дублирование).
При добавлении последовательность событий такая:
* ПередНачаломДобавления - строка еще не доступна
При дублировании последовательность событий такая:
* ПередНачаломДобавления - строка еще не доступна
* ПриАктивизацииЯчейки - строка уже доступна, но строка пустая.
* Повторная ПриАктивизацииЯчейки - строка уже заполнена.
Как быть?
Для решения данной задачи необходимо использовать ПриНачалеРедактирования :
Код 1C v 8.х Процедура ОтчетПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
Если НоваяСтрока Тогда
Элемент.ТекущиеДанные.Дата = ТекущаяДата();
Элемент.ТекущиеДанные.Менеджер = ПараметрыСеанса.ТекущийПользователь;
КонецЕсли;
КонецПроцедуры
В реалии это выглядит так, нажали добавить и получили:
Категория:
Работа с Формой (Диалог) и её элементами Как запретить создание документа копированием? Бывает, нужно программно запретить копирование документа , в данной статье несколько способов реализации этого:
Код 1C v 8.2 УП Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если НЕ Параметры.ЗначениеКопирования.Пустая() Тогда
Отказ = Истина; СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
В перед открытием
Код 1C v 8.х Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Если ЭтоНовый() Тогда // если объект новый
Если ЗначениеЗаполнено(ПараметрОбъектКопирования) Тогда // и существует объект копирования
Если ПараметрОбъектКопирования.Дата < Дата("20100101000000") Тогда // и условие запрета выполнено
Отказ = Истина; // Тада катись "шарик" лесом
Сообщить("Копирование документов заданного периода запрещено. Операция прервана");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// ИЛИ
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Если ЭтаФорма.ПараметрОбъектКопирования = Неопределено Тогда
///
Иначе
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
запретить в форме Списка или Журнала в событии "перед началом добавления".
Код 1C v 8.х Процедура ДокументСписокПередНачаломДобавления(Элемент, Отказ, Копирование)
Если копирование = истина тогда
отказ = Истина.
КонецЕсли;
КонецПроцедуры
Категория:
Документы Загрузка картинок в базу 1С (сохранение в хранилище значений) В теме форма: v8: Получение данных из ХралищаЗначений
Bell в управляемом интерфейсе пробует сохранить выбранные картинки в базу 1С, но возникли сложности с сохранением в хранилище значений. как пример Bell приложил CF файл с мини конфигурацией, за что ему большое спасибо, т.к. большая часть материалов этой статьи написана им, я лишь поправил небольшие участки кода связанные с передачей файлов и сохранение в хранилище значений.
Так как везде уже Такси, то CF я перевел в этот режим и в нем демонстрирую.
Имеется справочник Хранилище данных :
Основная Форма Элемента:
Ее код:
Код 1C v 8.3 // ПРОЦЕДУРЫ ФОРМЫ
//======================================================================================================
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Ссылка.Пустая() Тогда
Объект.Наименование = ".";
КонецЕсли;
Если НЕ Параметры.Ключ.Пустая() Тогда
ДанныеАдрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ДанныеХЗ");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Объект.Ссылка.Пустая() Тогда
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(ДанныеАдрес) Тогда
РежимСжатия = Новый СжатиеДанных(9);
ДанныеСохранения = ПолучитьИзВременногоХранилища(ДанныеАдрес);
ТекущийОбъект.ДанныеХЗ = Новый ХранилищеЗначения(ДанныеСохранения, РежимСжатия);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(ДанныеАдрес) Тогда
УдалитьИзВременногоХранилища(ДанныеАдрес);
ДанныеАдрес = ПолучитьНавигационнуюСсылку(ТекущийОбъект.Ссылка, "ДанныеХЗ");
КонецЕсли;
КонецПроцедуры
// ПРОЦЕДУРЫ ЭЛЕМЕНТОВ ФОРМЫ
//======================================================================================================
&НаКлиенте
Процедура ВыбратьДанные(Команда)
ДанныеВыбрать();
КонецПроцедуры
&НаКлиенте
Процедура СохранитьДанные(Команда)
Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
Предупреждение(НСтр("ru = 'Элемент не записан !!!'"));
Возврат;
КонецЕсли;
ДанныеСохранения = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ДанныеХЗ");
ИмяСохранения = Объект.Наименование;
//ИмяСохранения = Объект.Наименование + Объект.ДанныеРасширение;
ПолучитьФайл(ДанныеСохранения, ИмяСохранения, Истина);
КонецПроцедуры
// ПРОЦЕДУРЫ ПРОЧИЕ
//======================================================================================================
&НаКлиенте
Процедура ДанныеВыбрать()
ПолученныеДанныеАдрес = "";
Если ПоместитьФайл(ПолученныеДанныеАдрес, , Объект.ДанныеПуть, Истина, УникальныйИдентификатор)Тогда
ДанныеАдрес = ПолученныеДанныеАдрес;
ВыбранныйФайл = Новый Файл(Объект.ДанныеПуть);
Объект.Наименование = ВыбранныйФайл.Имя;
Объект.ДанныеТекущаяДата = ТекущаяДата();
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
так же имеется общая форма ФормаЗагрузкиФайлов
При помощи ее выбираются файлы изображений и загружаются в справочник - одновременно можно загружать несколько файлов
код формы:
Код 1C v 8.3 // ПРОЦЕДУРЫ ЭЛЕМЕНТОВ ФОРМЫ
//======================================================================================================
&НаКлиенте
Процедура СписокФайловПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
Отказ = Истина;
ДобавитьФайлы();
КонецПроцедуры
// ПРОЦЕДУРЫ ПРОЧИЕ
//======================================================================================================
&НаКлиенте
Процедура ДобавитьФайлы()
ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ВыборФайла.МножественныйВыбор = Истина;
ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'", "ru");
ВыборФайла.Фильтр = НСтр("ru = 'Все файлы'", "ru") + " (*.*)|*.*";
ВыборФайла.ПредварительныйПросмотр = Истина;
Если ВыборФайла.Выбрать() Тогда
Для каждого СтрокаФайл Из ВыборФайла.ВыбранныеФайлы Цикл
ОписаниеФайла = Новый Файл(СтрокаФайл);
НВС = СписокФайлов.Добавить();
НВС.ПолноеИмяФайла = СтрокаФайл;
НВС.РазмерФайла = ОписаниеФайла.Размер();
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Загрузить()
Если НЕ ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;
ОчиститьСообщения();
Если СписокФайлов.Количество() = 0 Тогда
Сообщить("Файлы не выбраны !!!'");
Возврат;
КонецЕсли;
ПомещаемыеФайлы = Новый Массив;
Для каждого СтрокаФайл Из СписокФайлов Цикл
Описание = Новый ОписаниеПередаваемогоФайла(СтрокаФайл.ПолноеИмяФайла, "");
ПомещаемыеФайлы.Добавить(Описание);
КонецЦикла;
// -------------------------------------------------------------------------------
ПомещенныеФайлы = Новый Массив;
СписокЗагруженныхФайлов = Новый СписокЗначений;
Если ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, УникальныйИдентификатор) Тогда
Закрыть(Истина);
Иначе
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр("ru = 'Файлы не загружены'", "ru");
Сообщение.Сообщить();
КонецЕсли;
ОповеститьОВыборе(ПомещенныеФайлы);
КонецПроцедуры
&НаСервере
Функция ПоместитьВыбранныеФайлыВХранилище(ПомещаемыеФайлы)
АдресХЗ = ПоместитьВоВременноеХранилище(ПомещаемыеФайлы, УникальныйИдентификатор);
Возврат АдресХЗ;
КонецФункции
в коде вызывается ОповеститьОВыборе(ПомещенныеФайлы) и срабатывает обработчик в ФормаСпискаДополнительно
Код 1C v 8.3 &НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ИсточникВыбора.ИмяФормы = "ОбщаяФорма.ФормаЗагрузкиФайлов" Тогда
ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
и следующим кодом идет создание элементов справочника и загрузка изображений из временного хранилища
Код 1C v 8.3 &НаСервере
Процедура ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение)
Для Каждого СтрокаФайл Из ВыбранноеЗначение Цикл
Файл = Новый Файл(СтрокаФайл.Имя);
ХранимыйФайл = Справочники.ХранилищеДанныхСправочники.СоздатьЭлемент();
ХранимыйФайл.Наименование = Файл.Имя;
ХранимыйФайл.ДанныеПуть = Файл.Путь;
ХранимыйФайл.ДанныеТекущаяДата = ТекущаяДата();
ХранимыйФайл.ДанныеХЗ = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(СтрокаФайл.Хранение), Новый СжатиеДанных());
ХранимыйФайл.Записать();
КонецЦикла;
Элементы.Список.Обновить();
КонецПроцедуры
Скачать DT - Платформа 8.3.4
Категория:
Работа с Хранилищем Значений Как программно установить событие для элемента формы? Код 1C v 8.х //Привяжем к нашей таблице вызов процедуры обработки
//события "ПередОкончаниемРедактирования" !!! процедура должна существовать !!!
ДействиеОбработкаВыбора = Новый Действие("ОбработкаВыбораЗнач");
ЭлементыФормы["Таблица"].УстановитьДействие("ПередОкончаниемРедактирования",ДействиеОбработкаВыбора);
Код 1C v 8.х //--- создаем новую закладку
тмпСтраницы = ЭлементыФормы.ОсновнаяПанель.Страницы;
СтраницаПанелиОПЗС = тмпСтраницы.Добавить("Производство", "Производство");
ЭлементыФормы.ОсновнаяПанель.ТекущаяСтраница = СтраницаПанелиОПЗС;
ПолеДокументов = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), "ап_Призводство", Истина, ЭлементыФормы.ОсновнаяПанель);
ПолеДокументов.Данные = "ап_Производство";
ПолеДокументов.УстановитьДействие("ПередУдалением", Новый Действие("апПроизводствоПередУдалением"));
ПолеДокументов.УстановитьДействие("ПередНачаломДобавления", Новый Действие("апПроизводствоПередНачаломДобавления"));
ПолеДокументов.УстановитьДействие("ПриПолученииДанных", Новый Действие("апПроизводствоПриПолученииДанных"));
Код 1C v 8.х Колонка.ЭлементУправления.УстановитьДействие("НачалоВыбора",Новый Действие(Действие"));
Код 1C v 8.х ЭлементыФормы.РасшифровкаПлатежа.Колонки.СтатьяДвиженияДенежныхСредств.ЭлементУправления.УстановитьДействие("НачалоВыбора",Новый Действие("_СтатьяДвиженияДенежныхСредствНачалоВыбора"))
Категория:
Работа с Формой (Диалог) и её элементами Форма ~ Программное создание таблицы значений с условным оформлением Как создать на форме таблицу и сделать для неё подсветку содержимого колонки в строке по условию?
Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем массив добавляемых реквизитов, который будет называться МассивДобавляемыхРеквизитов.
Код 1C v 8.2 УП МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("План", Новый ОписаниеТипов("ТаблицаЗначений")));
Обратите внимание, что элементы массива у нас типа РеквизитФормы. Дальше помимо таблицы значений, нам надо добавить колонки таблицы, например будем добавлять три колонки:
Код 1C v 8.2 УП МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"),"План" ,"Номенклатура"));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Регион", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,2)),"План" , "Регион"));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Разница", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,2)),"План" , "Осталось распределить"));
Во время добавления колонок в МассивДобавляемыхРеквизитов обязательно надо указать путь к создаваемому реквизиту, в нашем случае это «План», который был добавлен в массив ранее. Обратите внимание, что путь к создаваемому реквизиту не включает в себя сам реквизит. После того, как массив сформирован, можно вызывать изменение реквизитов:
Код 1C v 8.2 УП ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
После изменения реквизитов у нас уже есть нужный нам реквизит формы «План» типа ТаблицаЗначений с тремя колонками. Если вам надо будет обратиться к значению реквизита, то вы можете это сделать используя ЭтаФорма["План"]. Можно приступать к созданию элементов формы, для отображения данных. Сначала создадим элемент формы типа ТаблицаФормы.
Код 1C v 8.2 УП ТаблицаФормы = Элементы.Добавить("План", Тип("ТаблицаФормы"));
ТаблицаФормы.ПутьКДанным = "План";
ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
ТаблицаФормы.ФиксацияСлева = 3;
ТаблицаФормы.УстановитьДействие("ПередУдалением", "ПланПередУдалением");
ТаблицаФормы.УстановитьДействие("ПередНачаломДобавления", "ПланПередНачаломДобавления");
Как вы видите из приведенного когда, во время создания элемента мы тут же определяем действия на события. После создания элемента План типа ТаблицаФормы создадим подчиненные ему элементы типа ПолеФормы, которые будут отвечать у нас за вывод данных в колонки таблицы. Для этого в цикле перебора колонок таблицы необходимо выполнить следующий код (на примере одной из итераций цикла):
Код 1C v 8.2 УП НоваяКолонка = Элементы.Добавить("ПланНоменклатура", Тип("ПолеФормы"), Элементы.План);
НоваяКолонка.Заголовок = "Номенклатура";
НоваяКолонка.ПутьКДанным = "План.Номенклатура";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;
Обратите внимание, что во время добавления элемента мы указываем родителя Элементы.План. Так же путь к данным у нас состоит из наименования реквизита типа ТаблицаЗначений и имени колонки, разделенные точкой. После того, как вы в цикле создадите все элементы для колонок форма будет готова к выводу и вводу данных в таблицу.
Теперь можно перейти ко второй части задачи про подсветку цветом колонки Номенклатура. Например условие у нас будет накладываться на колонку Разница и когда она будет равно 100 строку надо будет подсвечивать колонку Номенклатуры серым цветом.
Для реализации этой части задачи мы будем использовать объект УсловноеОформление, который доступен на стороне сервера. Сначала в элементы условного оформления необходимо добавить новый элемент. Затем мы добавляем оформляемые поля. Если надо подсвечивать всю строку, то можно обойти в цикле колонки и добавить все их поля ввода в оформляемые. Так же необходимо потом добавить отбор. В левом значении отбора указываем поле, по которому будет идти сравнение. Поле указывает с точкой, как путь к данным во время добавления колонки.
Код 1C v 8.2 УП ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ПланНоменклатура");
ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("План.Разница");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = 100;
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СеребристоСерый);
Внешняя обработка, демонстрирующая создание таблицы значений программно -
Скачивать файлы может только зарегистрированный пользователь!
Андрей Данилюк Категория:
Работа с Формой (Диалог) и её элементами Универсальная форма для выбора пользователем значения из списка значений В данной статье описан пример создания универсальной Формы работы со списком значений:
1. Создадим в общих формах новую форму "ФормаРаботыСоСпискомЗначений", добавим на ней Табличное поле (Имя - СписокЗначений) и КоманднаяПанельСписокЗначений
На закладке Реквизиты, появится реквизит СписокЗначений
2. Привяжем КоманднаяПанельСписокЗначений к Источнику действий - СписокЗначений
3. В свойствах табличного поля пропишем События - Выбор и ПередНачаломДобавления
4. В модуле Формы пропишем обработку событий
Код 1C v 8.х Процедура ОсновныеДействияФормыВыбрать(Кнопка)
ТекущаяСтрока = ЭлементыФормы.СписокЗначений.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено Тогда
Закрыть(ТекущаяСтрока);
КонецЕсли;
КонецПроцедуры
Процедура СписокЗначенийПередНачаломДобавления(Элемент, Отказ, Копирование)
Отказ = Истина;
КонецПроцедуры
Процедура СписокЗначенийВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
ТекущаяСтрока = ЭлементыФормы.СписокЗначений.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено Тогда
Закрыть(ТекущаяСтрока);
КонецЕсли;
КонецПроцедуры
Процедура ЗакрытьФорму(Кнопка) //процедура действия кнопки закрыть
Закрыть();
КонецПроцедуры
Все, форма создана
Использовать ее для выбора значения, можно с помощью кода:
Код 1C v 8.х //К примеру Пользователю необходимо выбрать Вид расчета по которому в дальнейшем сформировать отчет.
Массив = ТаблицаНачислений.ВыгрузитьКолонку("Видрасчета"); //Выгружаем из таблицы начислений в Массив Виды Расчетов
Список = Новый СписокЗначений; // Создадим Список
Список.ЗагрузитьЗначения(Массив); // Загрузим в список Виды расчета из массива
ФормаРаботыСоСпискомЗначений = ПолучитьОбщуюФорму("ФормаРаботыСоСпискомЗначений"); // Получаем Нашу Универсальную Форму
ФормаРаботыСоСпискомЗначений.СписокЗначений = Список; // Передаем в нее список Видов Расчетов
ЭлементСписка = ФормаРаботыСоСпискомЗначений.ОткрытьМодально(); //Отрываем форму, чтобы пользователь выбрал значение из списка
//ЭлементСписка - Выбранный элемент, Если пользователь ничего не выбрал, а нажал Закрыть,
//то ЭлементСписка = Неопределено и пусть отчет формируется по всем Видам расчетов
Если ЭлементСписка <> Неопределено Тогда
ВидРасчета=ЭлементСписка.Значение; //Пользователь Выбрал из списка Вид расчета, формируем отчет по нему.
иначе
СписокВидовРасчетов = ФормаРаботыСоСпискомЗначений.СписокЗначений; // Пользователь нажал кнопку Закрыть, формируем по всем Видам Расчетов
КонецЕсли;
//----------------------Далее уже ваш модуль обработки...------------------------------------//
Пользователь увидит окно выбора значения:
Категория:
Работа с Списком Значений