&НаСервере
Процедура СопНомен_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// создаем элементы табличной части
нРеквизиты = Новый Массив;
нРеквизиты.Добавить(Новый РеквизитФормы("Выбрана", Новый ОписаниеТипов("Булево"), "Объект.Сопоставление", "Выбрана"));
ИзменитьРеквизиты(нРеквизиты);
// описываем элементы
// создаем для всех ТЧ поле выбора строк
нЭлемент = ЭтаФорма.Элементы.Добавить("Выбрана", Тип("ПолеФормы"), Элементы.Сопоставление);
нЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
нЭлемент.ПутьКДанным = "Объект.Сопоставление.Выбрана";
Если НЕ Команды.Найти("ВыбратьВсеСтроки") = Неопределено Тогда
Команды.Удалить(Команды.Найти("ВыбратьВсеСтроки"));
Команды.Удалить(Команды.Найти("ОтменитьВыборВсехСтрок"));
КонецЕсли;
Команда = Команды.Добавить("ВыбратьВсеСтроки");
Команда.Заголовок = "Выбрать все строки";
Команда.Действие = "КомандаВыбратьВсеСтроки";
КнопкаФормы = Элементы.Добавить("КомандаВыбратьВсеСтроки", Тип("КнопкаФормы"), Элементы.ФормаКоманднаяПанель);
КнопкаФормы.ИмяКоманды = "ВыбратьВсеСтроки";
КнопкаФормы.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
КнопкаФормы.Картинка = БиблиотекаКартинок.УстановитьФлажки;
КнопкаФормы.Отображение = ОтображениеКнопки.Картинка;
Команда = Команды.Добавить("ОтменитьВыборВсехСтрок");
Команда.Заголовок = "Отменить выбор всех строк";
Команда.Действие = "КомандаОтменитьВыборВсехСтрок";
КнопкаФормы = Элементы.Добавить("КомандаОтменитьВыборВсехСтрок", Тип("КнопкаФормы"), Элементы.ФормаКоманднаяПанель);
КнопкаФормы.ИмяКоманды = "ОтменитьВыборВсехСтрок";
КнопкаФормы.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
КнопкаФормы.Картинка = БиблиотекаКартинок.СнятьФлажки;
КнопкаФормы.Отображение = ОтображениеКнопки.Картинка;
Команда = Команды.Добавить("УстановитЗначениеРеквизита");
Команда.Заголовок = "Установить значение реквизита";
Команда.Действие = "КомандаУстановитЗначениеРеквизита";
КнопкаФормы = Элементы.Добавить("КомандаУстановитЗначениеРеквизита", Тип("КнопкаФормы"), Элементы.ФормаКоманднаяПанель);
КнопкаФормы.ИмяКоманды = "УстановитЗначениеРеквизита";
КнопкаФормы.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
КнопкаФормы.Картинка = БиблиотекаКартинок.ПеренестиЭлемент;
КнопкаФормы.Отображение = ОтображениеКнопки.КартинкаИТекст;
КонецПроцедуры
&НаКлиенте
Процедура КомандаВыбратьВсеСтроки()
Для Каждого ТекСтрока Из Объект.Сопоставление Цикл
ТекСтрока.Выбрана = Истина;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура КомандаОтменитьВыборВсехСтрок()
Для Каждого ТекСтрока Из Объект.Сопоставление Цикл
ТекСтрока.Выбрана = Ложь;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура КомандаУстановитЗначениеРеквизита(Команда)
// список для выбора столбца для установки значения
СписокНоменклатуры = Новый СписокЗначений;
СписокПолейДляУстановкиРеквизита = ПолучитьПоляДляПоиска(Истина);
ИмяТекущегоРеквизита = ПолучитьТекущийРеквизитТЧ();
ОповещениеПослеВыбораРеквизита = Новый ОписаниеОповещения("ОбработкаВыбораРеквизита", ЭтотОбъект);
СписокПолейДляУстановкиРеквизита.ПоказатьВыборЭлемента(ОповещениеПослеВыбораРеквизита,"Выберите столбец для установки значения:", СписокПолейДляУстановкиРеквизита.НайтиПоЗначению(ИмяТекущегоРеквизита));
КонецПроцедуры
&НаСервере
Функция ПолучитьПоляДляПоиска(ВсеПоля = Ложь, Параметр = Неопределено, СлужебныеНазванияПолей = Ложь)
РеквизитыСправочника = Метаданные.Обработки.СопоставлениеНоменклатурыБЭД.ТабличныеЧасти["Сопоставление"].Реквизиты;
СписокВозрата = Новый СписокЗначений;
Для Каждого ТекСтрока ИЗ РеквизитыСправочника Цикл
СписокВозрата.Добавить(ТекСтрока.Имя, ТекСтрока.Синоним);
КонецЦикла;
Возврат СписокВозрата;
КонецФункции
&НаСервере
Функция ПолучитьТекущийРеквизитТЧ()
Если НЕ Элементы.Сопоставление.ТекущийЭлемент = Неопределено Тогда
Возврат Элементы.Сопоставление.ТекущийЭлемент.Имя;
КонецЕсли;
КонецФункции // ПолучитьТекущийРеквизитТЧ()
&НаКлиенте
Процедура ОбработкаВыбораРеквизита(Элемент, Параметры) Экспорт
Если Элемент <> Неопределено Тогда
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Выбрана", Истина);
НайденныеСтроки = Объект.Сопоставление.НайтиСтроки(ПараметрыОтбора);
// проверка на то, что есть выбранные строки в т.ч. Покупки
Если Не ЕстьВыбранныеСтрокиПокупки(НайденныеСтроки) Тогда
Возврат;
КонецЕсли;
Если Элемент.Значение = "Номенклатура" Тогда
// явно назначаем тип номенклатуры
//УстановитьТипЗначенияДляКолонкиМассива("Номенклатура",НайденныеСтроки);
Для Каждого ТекСтрока Из НайденныеСтроки Цикл
ТекСтрока.Номенклатура = ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка");
КонецЦикла;
КонецЕсли;
ТипВыбранныхЭлементов = ТипЗнч(НайденныеСтроки[0][Элемент.Значение]);
ЗначениеВыбранногоЭлемента = НайденныеСтроки[0][Элемент.Значение];
Подсказка = "Введите новое значение для выбранного поля";
Оповещение = Новый ОписаниеОповещения("ПослеВводаСтроки", ЭтотОбъект,Элемент.Значение);
Если ТипВыбранныхЭлементов = Тип("Строка") Тогда
ПоказатьВводСтроки(Оповещение, "", Подсказка, 0, Истина);
ИначеЕсли ТипВыбранныхЭлементов = Тип("Дата") Тогда
ПоказатьВводДаты(Оповещение, "", Подсказка);
ИначеЕсли ТипВыбранныхЭлементов = Тип("Число") Тогда
ПоказатьВводЧисла(Оповещение, "", Подсказка);
ИначеЕсли ТипВыбранныхЭлементов = Тип("Булево") Тогда
ПоказатьВопрос(Оповещение, "Выберите вариант для установки значения", РежимДиалогаВопрос.ДаНет);
ИначеЕсли ТипВыбранныхЭлементов = Тип("Неопределено") Тогда
// обработка для Неопределено, если у реквизита составной тип данных и он изначально пустой, то необходимо это условие
ОчиститьСообщения();
Если СтрНайти(Элемент,"Субконто") > 0 Тогда
// это субконто
Если Объект.КакаяКонфигурация = "ЭтоБухгалтерия" Тогда
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ПолеДляУстановки", Элемент.Значение);
// список для выбора типа данных
СписокПолейДляВыбораТипаДанных = ПолучитьТипыДанныхСубконто();
//ИмяТекущегоРеквизита = ПолучитьТекущийРеквизитТЧ();
ОповещениеПослеВыбораРеквизита = Новый ОписаниеОповещения("КомандаУстановитьЗначениеРеквизитаДляСубконто", ЭтотОбъект, ДополнительныеПараметры);
СписокПолейДляВыбораТипаДанных.ПоказатьВыборЭлемента(ОповещениеПослеВыбораРеквизита,"Выберите тип данных");
КонецЕсли;
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Установка значение реквизита невозможна. Возможно, необходимо выбрать тип реквизита";
Сообщение.Сообщить();
КонецЕсли;
Иначе
// ссылочный тип
ОтобразитьУниверсальнуюФормуВыбора(Элемент.Значение, ТипВыбранныхЭлементов, ЗначениеВыбранногоЭлемента);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеВводаСтроки(Строка, Параметры) Экспорт
Если ТипЗнч(Строка) = Тип("КодВозвратаДиалога") Тогда
Если Строка = КодВозвратаДиалога.Да Тогда
УниверсальнаяОбработкаДляПредпросмотра("Да", Параметры);
Иначе
УниверсальнаяОбработкаДляПредпросмотра("Нет", Параметры);
КонецЕсли;
ИначеЕсли НЕ Строка = Неопределено Тогда
УниверсальнаяОбработкаДляПредпросмотра(Строка, Параметры);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УниверсальнаяОбработкаДляПредпросмотра(ВыбранноеЗначение, ИмяПоляДляЗаполнения = Неопределено)
Если ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Выбрана", Истина);
НайденныеСтроки = Объект.Сопоставление.НайтиСтроки(ПараметрыОтбора);
// проверка на то, что есть выбранные строки в т.ч. Покупки
Если Не ЕстьВыбранныеСтрокиПокупки(НайденныеСтроки) Тогда
Возврат;
КонецЕсли;
// список для создания новой номенклатуры
СписокНоменклатуры = Новый СписокЗначений;
СписокПолейДляПоиска = ПолучитьПоляДляПоиска(Истина);
НужноЗапомнитьПолеЗаполнения = Истина;
ТакойЭлементУжеЕсть = ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ЭтаФорма, "ТЧДляСохраненияВСправочник");
Если ТакойЭлементУжеЕсть Тогда
ЭтаФорма.ТЧДляСохраненияВСправочник.Очистить();
КонецЕсли;
ЭтоПерваяСтрока = Истина;
Для Каждого НайденнаяСтрока из НайденныеСтроки Цикл
НачальноеЗначениеПоля = НайденнаяСтрока[ИмяПоляДляЗаполнения];
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОтобразитьУниверсальнуюФормуВыбора(ИмяЭлемента, ТипВыбранныхЭлементов, ЗначениеВыбранногоЭлемента)
ПутьКФормеВыбора = НайтиПутьКЭлементуВМетаданных(ИмяЭлемента, ТипВыбранныхЭлементов);
ПараметрыПодбора = Новый Структура;
ПараметрыПодбора.Вставить("УникальныйИдентификаторФормыВладельца", УникальныйИдентификатор);
ПараметрыПодбора.Вставить("ЗакрыватьПриВыборе", Истина);
ПараметрыПодбора.Вставить("РежимВыбора", Истина);
Если ТипЗнч(ЗначениеВыбранногоЭлемента) = Тип("Структура") Тогда
ПараметрыПодбора.Вставить("КлючНазначенияИспользования", "" + ЗначениеВыбранногоЭлемента.НазваниеНовойНоменклатуры + "###" + ЗначениеВыбранногоЭлемента.КудаПоместитьНовуюНоменклатуру);
Иначе
ПараметрыПодбора.Вставить("ТекущаяСтрока", ЗначениеВыбранногоЭлемента);
КонецЕсли;
ИмяПоляДляЗаполнения = ИмяЭлемента;
Форма = ПолучитьФорму(ПутьКФормеВыбора + ".ФормаВыбора", ПараметрыПодбора, ЭтаФорма);
Форма.Открыть();
КонецПроцедуры
&НаКлиенте
Функция ЕстьВыбранныеСтрокиПокупки(МассивНайденныхСтрок)
Если МассивНайденныхСтрок.Количество() = 0 Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Для выполнения действия выберите строки!";
Сообщение.Сообщить();
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
&НаСервере
Функция ПолучитьТипыДанныхСубконто()
// выбор типа данных с помощью метода списка значений
СписокТипов = Новый СписокЗначений;
Для Каждого ТекТип Из Метаданные.ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Тип.Типы() Цикл
СписокТипов.Добавить(ТекТип);
КонецЦикла;
СписокТипов.СортироватьПоЗначению(НаправлениеСортировки.Возр);
Возврат СписокТипов;
КонецФункции
&НаСервере
Функция НайтиПутьКЭлементуВМетаданных(ИмяЭлемента, ТипВыбранныхЭлементов)
Возврат Метаданные.НайтиПоТипу(ТипВыбранныхЭлементов).ПолноеИмя();
КонецФункции // НайтиПутьКЭлементуВМетаданных()
&НаКлиенте
Процедура СопНомен_ОбработкаВыбораПосле(ВыбранноеЗначение, ИсточникВыбора)
Если ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Выбрана", Истина);
НайденныеСтроки = Объект.Сопоставление.НайтиСтроки(ПараметрыОтбора);
// проверка на то, что есть выбранные строки в т.ч. Покупки
Если Не ЕстьВыбранныеСтрокиПокупки(НайденныеСтроки) Тогда
Возврат;
КонецЕсли;
Для Каждого НайденнаяСтрока из НайденныеСтроки Цикл
НайденнаяСтрока[ИмяПоляДляЗаполнения] = ВыбранноеЗначение;
НайденнаяСтрока.Сопоставлено = Истина;
КонецЦикла;
КонецЕсли;
КонецПроцедуры