Особенность использования метода ИзменитьРеквизиты()

23.04.15

Разработка - Механизмы платформы 1С

Обнаружил странное поведение платформы, которым и хочу поделиться

Скачать файлы

Наименование Файл Версия Размер
ТестоваяОбработка
.epf 7,71Kb
2
.epf 1 7,71Kb 2 Скачать

Исходные данные:

На форме имеется реквизит ТЗ с типом "таблица значений"

При создании формы на сервере эта таблица заполняется данными (все поля, кроме первого - "Идентификатор")

 

Что должно происходить:

По нажатию на кнопку для каждой строки должно создаться поле ввода и имя этого поля должно записаться в первую колонку ТЗ ("Идентификатор")

 

Что происходит:

Заполняется только первая строка, а далее все строки пустые

 

Код

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Для Сч=1 По 4 Цикл
		НоваяСтрока = тзПробег.Добавить();
		НоваяСтрока.Автомобиль = "Автомобиль" + Сч;
		НоваяСтрока.ВидТоплива = "ВидТоплива" + Сч;
		НоваяСтрока.ВидОборудования = "ВидОборудования" + Сч;
		НоваяСтрока.Пробег = Сч *1000;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура СоздатьНовыеПоляВвода(Команда)
	ОбновитьРеквизитыФормыПоВидамТоплива();
КонецПроцедуры

&НаСервере
Процедура ОбновитьРеквизитыФормыПоВидамТоплива()
	
	// переменнные
	ГруппаРодитель = Элементы.ГруппаПробегиПоВидамТоплива;
	
	// удалим старые поля и реквизиты
	МассивУдаляемыхРеквизитов = Новый Массив;
	Для Сч = -ГруппаРодитель.ПодчиненныеЭлементы.Количество() По -1 Цикл
		МассивУдаляемыхРеквизитов.Добавить(ГруппаРодитель.ПодчиненныеЭлементы[-Сч-1].Имя);
		Элементы.Удалить(ГруппаРодитель.ПодчиненныеЭлементы[-Сч-1]);
	КонецЦикла;
	Если МассивУдаляемыхРеквизитов.Количество() Тогда 
		ИзменитьРеквизиты(, МассивУдаляемыхРеквизитов);
	КонецЕсли;
	
	// создание описания типов для реквизита формы
	КЧ = Новый КвалификаторыЧисла(10,2);
	Массив = Новый Массив;
	Массив.Добавить(Тип("Число"));
	ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ); 
	
	// создадим новые
	Для каждого СтрокаТЗ Из тзПробег Цикл
		
		// создаем уникальное наименование поля
		УникальноеИмя = "Поле" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
		
		// помещаем в таблицу, чтобы потом можно было найти данные, соответствующие этому полю
		СтрокаТЗ.Идентификатор = УникальноеИмя;
		
		// создаем реквизит формы
		ДобавляемыеРеквизиты = Новый Массив;
		НовыйРеквизит = Новый РеквизитФормы(УникальноеИмя, ОписаниеТиповЧ);
		НовыйРеквизит.Заголовок = "Пробег по топливу " + СтрокаТЗ.ВидТоплива;
		ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
		
		Сообщить("В поле Идентификатор строки содержится значение: " + тзПробег[СтрокаТЗ.ПолучитьИдентификатор()].Идентификатор);
		Сообщить("тзПробег[СтрокаТЗ.ПолучитьИдентификатор()] = СтрокаТЗ: " + (тзПробег[СтрокаТЗ.ПолучитьИдентификатор()] = СтрокаТЗ));
		ИзменитьРеквизиты(ДобавляемыеРеквизиты);
		Сообщить("После применения команды ИзменитьРеквизиты: " + тзПробег[СтрокаТЗ.ПолучитьИдентификатор()].Идентификатор);
		Сообщить("тзПробег[СтрокаТЗ.ПолучитьИдентификатор()] = СтрокаТЗ: " + (тзПробег[СтрокаТЗ.ПолучитьИдентификатор()] = СтрокаТЗ));
		Сообщить("");
		// заполним значением из ПЛ
		ЭтаФорма[УникальноеИмя] = СтрокаТЗ.Пробег;
		
		// добавляем новое поле ввода на форму
		Элемент = ЭтаФорма.Элементы.Добавить(УникальноеИмя, Тип("ПолеФормы"), ГруппаРодитель); 
		Элемент.Вид = ВидПоляФормы.ПолеВвода;
		Элемент.ПутьКДанным = УникальноеИмя;
		ШаблонШрифта = Новый Шрифт(, 24, Истина);
		Элемент.Шрифт = ШаблонШрифта;
		Элемент.ШрифтЗаголовка = ШаблонШрифта;
		
		// TO DO: заменить на вызов в процедуре по кнопке ввести данные перезаполнения ТЗ, если поля были из конкретной группы
		Элемент.УстановитьДействие("ПриИзменении", "ПробегПоТопливуПриИзменении");
		
	КонецЦикла;

КонецПроцедуры
 

Комментарий: 

Конкретно эта обработка конечно надуманная, не претендует на оптимальность выполнения кода и т.п.

Она служит только для демонстрации замеченной мной особенности

Специально обрамил ИзменитьРеквизиты() выводом сообщений, чтобы показать, что СтрокаТЗ становится "чем-то другим" именно после применения этого метода

В данном случае Истину вернет только один раз - только для первой строки


Вывод: 

При обходе ТЗ циклом Для каждого чтобы быть уверенным, что ТЗ заполнится, необходимо использовать конструкцию, подобную следующей:

ТЗ[СтрокаТЗ.ПолучитьИдентификатор()]

Так мы точно будем уверены, что ТЗ заполнится корректно


UPD: на некоторых тестах возникала ошибка, вот это обращение более универсальное

тзПробег.НайтиПоИдентификатору(СтрокаТЗ.ПолучитьИдентификатор()).Идентификатор = УникальноеИмя; 

ИзменитьРеквизиты

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4492    dsdred    53    

71

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5286    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6403    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18469    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12086    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8810    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6274    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15980    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. jobkostya1c_ERP 100 04.05.15 18:19 Сейчас в теме
Интересную Вы заметили особенность метода ИзменитьРеквизиты(). Нужно учесть.
Оставьте свое сообщение