Теперь чуть поточнее задачу. В документе, в табличной части необходимо добавить дополнительный реквизит со ссылкой на другой документ. Если ссылка не заполнена, то отображать слово "Создать", с возможностью создать этот документ и автоматическим помещением в этот реквизит ссылку на этот созданный документ. Добавить ниже еще одну ссылку на выбор документа из базы.
В табличную часть документа был добавлен реквизит "aspect_Поступление", тип ДокументСссылка.ПоступлениеТоваровУслуг
В форме документа в процедуре ПриСозданииНаСервере следующий код:
// {1c-aspect; rybakov@1c-aspect.ru; Начало 22.05.2018}
// Маркер: создание докумнета поступление товаров без проведения текущего
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("aspect_Привязать", Новый ОписаниеТипов("Строка"), "Объект.Затраты", "", Истина));
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
НоваяГруппа = Элементы.Вставить("aspect_ГруппаПоступлений", Тип("ГруппаФормы"), Элементы.ПолучаемыеУслуги);
НоваяГруппа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
НоваяГруппа.ОтображатьЗаголовок = Ложь;
НоваяГруппа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
Элементы.Переместить(НоваяГруппа, Элементы.ПолучаемыеУслуги, Элементы.ПолучаемыеУслугиСтатьяЗатрат);
НовыйРеквизит = Элементы.Добавить("aspect_Поступление", Тип("ПолеФормы"), НоваяГруппа);
НовыйРеквизит.Заголовок = "Поступление";
НовыйРеквизит.Вид = ВидПоляФормы.ПолеНадписи;
НовыйРеквизит.ПутьКДанным = "Объект.Затраты.aspect_Поступление";
НовыйРеквизит.ГиперссылкаЯчейки = Истина;
НовыйРеквизит.Гиперссылка = Истина;
НовыйРеквизит = Элементы.Добавить("aspect_Привязать", Тип("ПолеФормы"), НоваяГруппа);
НовыйРеквизит.Вид = ВидПоляФормы.ПолеНадписи;
НовыйРеквизит.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
НовыйРеквизит.ГиперссылкаЯчейки = Истина;
НовыйРеквизит.Гиперссылка = Истина;
НовыйРеквизит.ПутьКДанным = "Объект.Затраты.aspect_Привязать";
ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("aspect_Поступление");
ОтборЭлемента = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Затраты.aspect_Поступление");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Текст" , "Создать");
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста" , Новый Цвет(28, 85, 174));
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ГоризонтальноеПоложение", ГоризонтальноеПоложение.Центр);
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ВертикальноеПоложение" , ВертикальноеПоложение.Центр);
ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("aspect_Привязать");
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Текст" , "Привязать");
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста" , Новый Цвет(28, 85, 174));
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ГоризонтальноеПоложение", ГоризонтальноеПоложение.Центр);
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ВертикальноеПоложение" , ВертикальноеПоложение.Центр);
// {1c-aspect; rybakov@1c-aspect.ru; Конец 22.05.2018}
В процедуре Выбор нужной табличной части прописать следующее:
ТекСтрока = Элементы.ПолучаемыеУслуги.ТекущиеДанные;
// {1c-aspect; rybakov@1c-aspect.ru; Начало 22.05.2018}
Если Поле = Элементы.aspect_Поступление Тогда
Если ЗначениеЗаполнено(ТекСтрока.aspect_Поступление) Тогда
ПараметрыНовойФормы = Новый Структура("Ключ", ТекСтрока.aspect_Поступление);
ФормаДокумента = ПолучитьФорму("Документ.уатПоступлениеТоваровУслуг.Форма.ФормаДокумента", ПараметрыНовойФормы);
ФормаДокумента.Открыть();
Иначе
Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Вопрос(НСтр("ru = 'Документ не записан. Записать?'"), Режим, 0);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Возврат;
Иначе
Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Запись));
КонецЕсли;
КонецЕсли;
aspect_СоздатьДокументПТиУНаСервере(ТекСтрока.НомерСтроки);
Модифицированность = Истина;
КонецЕсли;
ИначеЕсли Поле = Элементы.aspect_Привязать Тогда
Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Вопрос(НСтр("ru = 'Документ не записан. Записать?'"), Режим, 0);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Возврат;
Иначе
Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Запись));
КонецЕсли;
КонецЕсли;
ПараметрыОтбора = Новый Структура();
ПараметрыОтбора.Вставить("ДокументОснование", Объект.Ссылка);
Отбор = Новый Структура();
Отбор.Вставить("Отбор", ПараметрыОтбора);
aspect_НомерСтрокиПоступления = ТекСтрока.НомерСтроки;
ОткрытьФорму("Документ.уатПоступлениеТоваровУслуг.ФормаВыбора", Отбор, ЭтаФорма);
// {1c-aspect; rybakov@1c-aspect.ru; Конец 22.05.2018}
КонецЕсли;
Серверная процедура по созданию документа:
&НаСервере
Процедура aspect_СоздатьДокументПТиУНаСервере(НомерСтроки)
ТекСтрока = Объект.Затраты[НомерСтроки - 1];
НовыйДокумент = Документы.уатПоступлениеТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Комментарий = Объект.Комментарий;
НовыйДокумент.Организация = Объект.Организация;
НовыйДокумент.Ответственный = Объект.Ответственный;
НовыйДокумент.ДокументОснование = Объект.Ссылка;
НовыйДокумент.Контрагент = ТекСтрока.Контрагент;
НовыйДокумент.ДоговорКонтрагента = ТекСтрока.Договор;
Если ЗначениеЗаполнено(НовыйДокумент.ДоговорКонтрагента) Тогда
НовыйДокумент.ВалютаДокумента = НовыйДокумент.ДоговорКонтрагента.ВалютаВзаиморасчетов;
ВалютаРасчетовКурсКратность = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(НовыйДокумент.Дата,
Новый Структура("Валюта", НовыйДокумент.ДоговорКонтрагента.ВалютаВзаиморасчетов));
НовыйДокумент.КурсВзаиморасчетов = ?(ВалютаРасчетовКурсКратность.Курс = 0, 1, ВалютаРасчетовКурсКратность.Курс);
НовыйДокумент.КратностьВзаиморасчетов = ?(ВалютаРасчетовКурсКратность.Кратность = 0, 1,
ВалютаРасчетовКурсКратность.Кратность);
КонецЕсли;
НовыйДокумент.Склад = ТекСтрока.aspect_Склад;
// добавим услугу
НоваяСтрока = НовыйДокумент.Услуги.Добавить();
НоваяСтрока.Номенклатура = ТекСтрока.Номенклатура;
НоваяСтрока.Заказ = ТекСтрока.ЗаказНаТС;
НоваяСтрока.Содержание = ТекСтрока.Содержание;
НоваяСтрока.Количество = ТекСтрока.Количество;
НоваяСтрока.СтавкаНДС = ТекСтрока.СтавкаНДС;
НоваяСтрока.Цена = ТекСтрока.Цена;
НоваяСтрока.Сумма = ТекСтрока.Сумма;
НоваяСтрока.СуммаНДС = ТекСтрока.СуммаНДС;
Попытка
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
ТекСтрока.aspect_Поступление = НовыйДокумент.Ссылка;
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
В раздел описания переменных добавить:
// {1c-aspect; rybakov@1c-aspect.ru; Начало 22.05.2018}
&НаКлиенте
Перем aspect_НомерСтрокиПоступления;
// {1c-aspect; rybakov@1c-aspect.ru; Конец 22.05.2018}
Необходимо для того, чтобы передать номер обрабатываемой строки. Т.к. у надписи нет события ОбработкаВыбора. Поэтому приходится использовать событие формы.
В процедуру ОбработкаВыбора формы добавить:
// {1c-aspect; rybakov@1c-aspect.ru; Начало 22.05.2018}
Если ИсточникВыбора.ИмяФормы = "Документ.уатПоступлениеТоваровУслуг.Форма.ФормаВыбора" Тогда
Если НЕ aspect_НомерСтрокиПоступления = Неопределено Тогда
Объект.Затраты[aspect_НомерСтрокиПоступления - 1].aspect_Поступление = ВыбранноеЗначение;
Модифицированность = Истина;
КонецЕсли;
// {1c-aspect; rybakov@1c-aspect.ru; Конец 22.05.2018}
КонецЕсли;