Именение типа субконто при изменении счета в тз. Ошибка попытка установить значение для значение Неопределено.

1. IrinaBasova 24.09.18 04:56 Сейчас в теме
Добрый день. Конфигурация в режиме управляемого приложения. Есть тз которая заполняется данными и выводиться на форму программно. Вопрос как правильно по аналогии с типовой заполнить тип субконто при выборе счета. Пока у меня все заканчивается с ошибкой.
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. IrinaBasova 24.09.18 05:03 Сейчас в теме
 ТаблицаРезультат = Запрос.Выполнить().выгрузить();
	ТаблицаРезультат.Колонки.Добавить("СчетЗакрытия");	
	ТаблицаРезультат.Колонки.Добавить("Субконто1");
	ТаблицаРезультат.Колонки.Добавить("Субконто2");
	ТаблицаРезультат.Колонки.Добавить("Субконто3");
	ТаблицаРезультат.Колонки.Добавить("Сумма");
	
		
// Удалим колонки таблицы перед обновление

    Таблица = РеквизитФормыВЗначение("ДанныеТаблицы");
	МассивРеквизитов = Новый Массив;
	
	Для Каждого Колонка Из Таблица.Колонки Цикл
		МассивРеквизитов.Добавить("ДанныеТаблицы." + Колонка.Имя);       
	КонецЦикла;
	// Вторым параметром передаем то что нужно удалить
	// Первым параметром то что нужно создать
	ИзменитьРеквизиты(,МассивРеквизитов);
	
	// Теперь удаляем таблицу с формы
	ЭлементТаблица = Элементы.Найти("ДанныеТаблицы");
	Если ЭлементТаблица <> Неопределено Тогда
		Элементы.Удалить(ЭлементТаблица);       
	КонецЕсли;    
	// И добавляем ее заново
	ЭлементТаблица=Элементы.Добавить("ДанныеТаблицы", Тип("ТаблицаФормы"),Элементы.ПараметрыЗакрытия);
	ЭлементТаблица.ПутьКДанным = "ДанныеТаблицы";
	ЭлементТаблица.Отображение = ОтображениеТаблицы.Список;  
	
	// Создаем реквизиты таблицы значений
	МассивРеквизитов.Очистить();
	Для Каждого Колонка ИЗ ТаблицаРезультат.Колонки Цикл
		МассивТипов = Новый Массив;
		МассивТипов.Добавить(Колонка.ТипЗначения);
		НоваяКолонка = Новый РеквизитФормы(Колонка.Имя,
		Новый ОписаниеТипов(МассивТипов), "ДанныеТаблицы");
		МассивРеквизитов.Добавить(НоваяКолонка);
	КонецЦикла;
	// Первый параметр, это то что нужно создать
	ИзменитьРеквизиты(МассивРеквизитов); 
	ЗначениеВРеквизитФормы(ТаблицаРезультат, "ДанныеТаблицы");
	
	// Создаем на форме элементы управления
	// Т.е. выводим таблицу значений и ее колонки
	ЭлементТЗ = Элементы.ДанныеТаблицы;
	МасТипСч=Новый Массив();
	МасТипСч.Добавить(Тип("ПланСчетовСсылка.Типовой"));
	МасТипСубк=Новый Массив();
	МасТипСубк.Добавить(Тип("ПланВидовХарактеристикСсылка.ВидыСубконтоТиповые"));
	Для Каждого Колонка ИЗ ТаблицаРезультат.Колонки Цикл
		НовыйЭлементФормы = Элементы.Добавить("ДанныеТаблицы" + Колонка.Имя,
		Тип("ПолеФормы"), ЭлементТЗ);	
		Если Колонка.Имя="СчетЗакрытия" Тогда
			
			НовыйЭлементФормы.ОграничениеТипа=Новый ОписаниеТипов(МасТипСч);	
            НовыйЭлементФормы.УстановитьДействие("ПриИзменении" ,"ДанныеТаблицыСЧЗакрытияПриИзменении");
		КонецЕсли;
      Для Ин=1 по 3 Цикл
		  Если Колонка.Имя=Строка("Субконто"+ин) Тогда
			НовыйЭлементФормы.ОграничениеТипа=Новый ОписаниеТипов(МасТипСубк);  
			
		  КонецЕсли;
	  КонецЦикла;		
			НовыйЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
		НовыйЭлементФормы.ПутьКДанным = "ДанныеТаблицы." + Колонка.Имя;
	КонецЦикла;
   
Показать


Здесь заполняется тз
3. IrinaBasova 24.09.18 05:06 Сейчас в теме
(2)Там же пытаюсь присвоить тип для субконто
4. Bene_Valete 188 24.09.18 06:16 Сейчас в теме
Поподробнее, какой тип Вы хотите установить для субконто, в проводках какого документа?
5. IrinaBasova 24.09.18 06:21 Сейчас в теме
(4)у меня самописная обработка, тип субконто хочу установить при изменении счета(в зависимости от счета). По аналогии с типовым документом у субконто изначально тип Характеристика.ВидыСубконто. Я пытаюсь при создании тз так же установить тип, и затем при изменении счета, установить тип справочника в субконто
6. IrinaBasova 24.09.18 06:24 Сейчас в теме
(5)но при использовании типовых процедур выходит ошибка. Т.к. тип субконто приходит неопределено
7. Bene_Valete 188 24.09.18 06:27 Сейчас в теме
(6) В приведенном коде, в какой строке возникает ошибка?
8. IrinaBasova 24.09.18 06:40 Сейчас в теме
(7)
 ИдСтроки = Элементы.ДанныеТаблицы.ТекущаяСтрока;	
   Если ИдСтроки = Неопределено Тогда
        Возврат;
    КонецЕсли;
    СтрокаТаблицы = ДанныеТаблицы.НайтиПоИдентификатору(ИдСтроки);
    
    ПоляФормы = Новый Структура("Субконто1,Субконто2,Субконто3",Строкатаблицы.Субконто1,Строкатаблицы.Субконто2,Строкатаблицы.Субконто3);
    ПроцедурыБухгалтерскогоУчетаКлиентСервер.ПриВыбореСчета(СтрокаТаблицы["СчетЗакрытия"], ЭтаФорма, ПоляФормы, Неопределено,истина);

Процедура ПриВыбореСчета(Счет, Форма, ПоляФормы, ЗаголовкиПолей = Неопределено, ЭтоТаблица = Ложь) Экспорт
	
	ДанныеСчета = ПроцедурыБухгалтерскогоУчетаВызовСервераПовтИсп.ПолучитьСвойстваСчета(Счет);
	
	Для Индекс = 1 По 3 Цикл
		Если Индекс <= ДанныеСчета.КоличествоСубконто Тогда
			Если ЭтоТаблица Тогда
				Если ПоляФормы.Свойство("Субконто" + Индекс) Тогда
					Форма.Элементы[ПоляФормы["Субконто" + Индекс]].ОграничениеТипа = ДанныеСчета["ВидСубконто" + Индекс + "ТипЗначения"];
				КонецЕсли;
			Иначе
				Если ЗаголовкиПолей.Свойство("Субконто" + Индекс) Тогда
					Форма[ЗаголовкиПолей["Субконто" + Индекс]] = ДанныеСчета["ВидСубконто" + Индекс + "Наименование"] + ":";
				КонецЕсли;
				Если ПоляФормы.Свойство("Субконто" + Индекс) Тогда
					Форма.Элементы[ПоляФормы["Субконто" + Индекс]].Видимость       = Истина;
					Форма.Элементы[ПоляФормы["Субконто" + Индекс]].ОграничениеТипа = ДанныеСчета["ВидСубконто" + Индекс + "ТипЗначения"];
				КонецЕсли;
			КонецЕсли;
		Иначе 
			// Ничего делать не надо, т.к. не доступные поля будут скрыты
			Если НЕ ЭтоТаблица Тогда
				Если ЗаголовкиПолей.Свойство("Субконто" + Индекс) Тогда
					Форма[ЗаголовкиПолей["Субконто" + Индекс]] = "";
				КонецЕсли;
				Если ПоляФормы.Свойство("Субконто" + Индекс) Тогда
					Форма.Элементы[ПоляФормы["Субконто" + Индекс]].Видимость       = Ложь;
					Форма.Элементы[ПоляФормы["Субконто" + Индекс]].ОграничениеТипа = Новый ОписаниеТипов("Неопределено");
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры
Показать
9. IrinaBasova 24.09.18 06:41 Сейчас в теме
(8) В процедуре ПриВыбореСчета, в момент ограничения типа
10. neuro88 24.09.18 09:53 Сейчас в теме
(9) так и не удивительно, что не работает.

// Процедура установки типа и видимости субконто в зависимости от выбранного счета
//
// Параметры:
//	Счет			 - <План счетов> - Счет, для которого необходимо настроить тип и видимость субконто
//	Форма			 - <Управляемая форма> - Форма, которая содержит ПоляФормы и ЗаголовкиПолей
//	ПоляФормы		 - <Структура> - Ключи, которой Субконто1, Субконто2, Субконто3, 
//									 а значения имена соответствующих полей на форме (поля субконто)
//	ЗаголовкиПолей	 - <Структура> ИЛИ <Неопределено> - Ключи, которой Субконто1, Субконто2, Субконто3
//									 а значения имена соответствующих полей на форме (заголовки субконто)
//	ЭтоТаблица		 - <Булево>		 - Признак того, где выполняется настройка субконто. 
//
Показать

а Вы в ПоляФормы передаете не имена полей, а значения полей конкретной строки ТЗ
11. IrinaBasova 24.09.18 11:25 Сейчас в теме
(10)Все понятно все заработало, но получается что эта процедура изменяет тип колонки тз, а мне нужно строки.
12. IrinaBasova 24.09.18 11:30 Сейчас в теме
(11)
СтрокаТаблицы = Элементы.ДанныеТаблицы.ТекущиеДанные;
	
	ПоляОбъекта = Новый Структура("Субконто1, Субконто2, Субконто3",
								 "Субконто1", "Субконто2", "Субконто3");
	
	ДанныеСчета = ПроцедурыБухгалтерскогоУчетаВызовСервераПовтИсп.ПолучитьСвойстваСчета(СтрокаТаблицы.СчетЗакрытия);
	
	Для Индекс = 1 По 3 Цикл
		Если ПоляОбъекта.Свойство("Субконто" + Индекс) Тогда
			Если Индекс <= ДанныеСчета.КоличествоСубконто Тогда
				СтрокаТаблицы[ПоляОбъекта["Субконто" + Индекс]] = ДанныеСчета["ВидСубконто" + Индекс + "ТипЗначения"].ПривестиЗначение(СтрокаТаблицы[ПоляОбъекта["Субконто" + Индекс]]);
			Иначе 
				СтрокаТаблицы[ПоляОбъекта["Субконто" + Индекс]] = Неопределено;
			КонецЕсли;
		КонецЕсли;		
	КонецЦикла;
Показать


Делаю как описано выше. неплохо. Но выходит список всевозможных типов с позицией на нужном типе, как сделать так чтобы сразу открывался нужный по типу справочник?
13. neuro88 04.10.18 17:52 Сейчас в теме
(12) смотрите в сторону
БухгалтерскийУчетКлиентСервер.УстановитьСвойстваСубконтоСтрокиПриИзмененииСчета


Рассмотреть использование можно на примере типовой БП3.0
14. Greek26rusa 2 09.03.20 21:14 Сейчас в теме
(12)в итоге у вас получилось?
15. GetNight 46 09.06.21 19:34 Сейчас в теме
Я сегодня решал проблему с заполнением Субконто при автосоздании документа ТребованиеНакладная (источник - событие при проведении ОтчетаПроизводстваЗаСмену).

Коротко предыстория сути проблемы: при открытии ТребованияНакладной попытка распечатать приводила к требованию перепровести документ, что ломало все домики учёта (время проведения документа, ответственный и так далее)...

Выяснил, что проблему вызывало "дозаполнение" документа при открытии, что приводило к установке флага Модифицированности и вполне логичному требованию провести документ перед печатью.

Перехватил в конфигураторе перед открытием ТребованияНакладной значение ЭтотОбъект (Shift+F9), выгрузил его списком, потом перехватил начало выбора какого-то поля и снова выгрузил списком значение ЭтотОбъект... сравнил - и увидел, что перед открытием значения Субконто1, Субконто2 и Субконто3 имеют значение Неопределено, а потом - значения пустых ссылок разных типов.

Выяснил, что ТребованиеНакладная создаётся автоматически при проведении ОтчетаПроизводстваЗаСмену, соответствующий код нашёл через события. После заполнения счета затрат добавил такой код:

Для й = 1 По НоваяСтрока.СчетЗатрат.ВидыСубконто.Количество() Цикл
	НоваяСтрока["Субконто" + й] = НоваяСтрока.СчетЗатрат.ВидыСубконто[й-1].ВидСубконто.ТипЗначения.ПривестиЗначение();
КонецЦикла;


Вопрос был решён.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот