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

23.04.15

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ТестоваяОбработка
.epf 7,71Kb ver:1
2
2 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

 

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

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

 

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

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

 

Код

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

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

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

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

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

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

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

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

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


Вывод: 

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

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

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


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

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

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

См. также

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

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7470    bayselonarrend    20    

154

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

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5950    dsdred    16    

80

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

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

24.01.2024    17703    YA_418728146    26    

71

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

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

11.12.2023    11237    dsdred    44    

130

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

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

06.10.2023    23767    SeiOkami    48    

135

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

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

14.09.2023    18842    human_new    27    

80

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

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

28.08.2023    14751    YA_418728146    7    

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