gifts2017

ЗаполнитьЗначенияСвойств - заставляем работать в 7.7

Опубликовал Владислав Томашевич (tomvlad) в раздел Программирование - Практика программирования

Если вы используете в работе 1С:Предприятие 8.х, то наверняка знакомы и с замечательной системной процедурой, как ЗаполнитьЗначенияСвойств(). Ее использование помогает значительно упростить написание программного кода в ряде случае, делает его (код) более наглядным и простым. Но что же делать тем, кто до сих пор использует (постоянно или иногда) 1С:Предприятие 7.7?
Воспользуйтесь функцией ЗаполнитьЗначенияСвойств(). Она имеет тот же синтаксис, что и одноименная в 1С:Предприятии 8.х. Позволяет использовать в качестве Источника и Приемника список значений и (или) таблицу значений и сократить большой кусок кода буквально до пары строк.

// Копирует свойства Источника в Приемник.
//
// Параметры:
//  ДанныеПриемник             - ТаблицаЗначений, СписокЗначений - объект-приемник.
//  ДанныеИсточник             - ТаблицаЗначений, СписокЗначений - объект-источник.
//  СписокСвойствСтрока         - Строка - перечень свойств приемника, разделенных запятой.
//  ИсключаяСвойстваСтрока     - Строка - перечень свойств приемника, разделенных запятой.
//
Процедура ЗаполнитьЗначенияСвойств(ДанныеПриемник, ДанныеИсточник, СписокСвойствСтрока = "", ИсключаяСвойстваСтрока = "")

    СписокСвойств        = Разложить(СписокСвойствСтрока);
    ИсключаяСвойства    = Разложить(ИсключаяСвойстваСтрока);

    Если (ТипЗначенияСтр(ДанныеПриемник) = "ТаблицаЗначений")
        И (ТипЗначенияСтр(ДанныеИсточник) = "ТаблицаЗначений") Тогда

        Для Ном = 1 По ДанныеПриемник.КоличествоКолонок() Цикл

            Колонка = ДанныеПриемник.ПолучитьПараметрыКолонки(Ном);

            Если (ПустоеЗначение(СписокСвойствСтрока) = 0)
                И (СписокСвойств.Принадлежит(Колонка) = 0) Тогда

                Продолжить;

            КонецЕсли;

            Если (ПустоеЗначение(ИсключаяСвойстваСтрока) = 0)
                И (ИсключаяСвойства.Принадлежит(Колонка) = 1) Тогда

                Продолжить;

            КонецЕсли;

            Попытка

                Значение = ДанныеИсточник.ПолучитьЗначение(ДанныеИсточник.НомерСтроки, Колонка);
                ДанныеПриемник.УстановитьЗначение(ДанныеПриемник.НомерСтроки, Колонка, Значение);

            Исключение
            КонецПопытки;

        КонецЦикла;

    ИначеЕсли (ТипЗначенияСтр(ДанныеПриемник) = "СписокЗначений")
        И (ТипЗначенияСтр(ДанныеИсточник) = "ТаблицаЗначений") Тогда

        Для Ном = 1 По ДанныеИсточник.КоличествоКолонок() Цикл

            Колонка = ДанныеИсточник.ПолучитьПараметрыКолонки(Ном);

            Если (ПустоеЗначение(СписокСвойствСтрока) = 0)
                И (СписокСвойств.Принадлежит(Колонка) = 0) Тогда

                Продолжить;

            КонецЕсли;

            Если (ПустоеЗначение(ИсключаяСвойстваСтрока) = 0)
                И (ИсключаяСвойства.Принадлежит(Колонка) = 1) Тогда

                Продолжить;

            КонецЕсли;

            Значение = ДанныеИсточник.ПолучитьЗначение(ДанныеИсточник.НомерСтроки, Колонка);

            ДанныеПриемник.Установить(Колонка, Значение);

        КонецЦикла;

    ИначеЕсли (ТипЗначенияСтр(ДанныеПриемник) = "ТаблицаЗначений")
        И (ТипЗначенияСтр(ДанныеИсточник) = "СписокЗначений") Тогда

        Для Ном = 1 По ДанныеИсточник.РазмерСписка() Цикл

            Колонка = "";
            Значение = ДанныеИсточник.ПолучитьЗначение(Ном, Колонка);

            Если (ПустоеЗначение(СписокСвойствСтрока) = 0)
                И (СписокСвойств.Принадлежит(Колонка) = 0) Тогда

                Продолжить;

            КонецЕсли;

            Если (ПустоеЗначение(ИсключаяСвойстваСтрока) = 0)
                И (ИсключаяСвойства.Принадлежит(Колонка) = 1) Тогда

                Продолжить;

            КонецЕсли;

            Попытка

                ДанныеПриемник.УстановитьЗначение(ДанныеПриемник.НомерСтроки, Колонка, Значение);

            Исключение
            КонецПопытки;

        КонецЦикла;

    ИначеЕсли (ТипЗначенияСтр(ДанныеПриемник) = "СписокЗначений")
        И (ТипЗначенияСтр(ДанныеИсточник) = "СписокЗначений") Тогда

        Для Ном = 1 По ДанныеИсточник.РазмерСписка() Цикл

            Ключ = "";
            Значение = ДанныеИсточник.ПолучитьЗначение(Ном, Ключ);

            Если ПустоеЗначение(Ключ) = 1 Тогда

                Продолжить;

            КонецЕсли;

            Если (ПустоеЗначение(СписокСвойствСтрока) = 0)
                И (СписокСвойств.Принадлежит(Ключ) = 0) Тогда

                Продолжить;

            КонецЕсли;

            Если (ПустоеЗначение(ИсключаяСвойстваСтрока) = 0)
                И (ИсключаяСвойства.Принадлежит(Ключ) = 1) Тогда

                Продолжить;

            КонецЕсли;

            ДанныеПриемник.Установить(Ключ, Значение);

        КонецЦикла;

    КонецЕсли;

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

КонецФункции
Пример:
ТаблицаИсточник = СоздатьОбъект("ТаблицаЗначений");
ТаблицаИсточник.НоваяКолонка("Контрагент");
ТаблицаИсточник.НоваяКолонка("Договор");
ТаблицаИсточник.НоваяКолонка("Сумма");

ТаблицаИсточник.НоваяСтрока();

ТаблицаИсточник.Контрагент = "Иванов";
ТаблицаИсточник.Договор = "Договор №1 от 01.02.2014";
ТаблицаИсточник.Сумма = 1000;

ТаблицаПриемник = СоздатьОбъект("ТаблицаЗначений");
ТаблицаПриемник.НоваяКолонка("Контрагент");
ТаблицаПриемник.НоваяКолонка("Договор");
ТаблицаПриемник.НоваяКолонка("Сумма");
ТаблицаПриемник.НоваяКолонка("Задолженность");

ТаблицаПриемник.НоваяСтрока();
ЗаполнитьЗначенияСвойств(ТаблицаПриемник, ТаблицаИсточник,, "Сумма,Договор");


См. также

Подписаться Добавить вознаграждение

Комментарии

1. Фаниль Исламов (fancy) 25.07.14 05:04
хм... в 1С 8.х ЗаполнитьЗначенияСвойств() больше полезно и наверное чаще используется для заполения реквизитов объектов (Справочник, Документ...), а здесь можно заполнить лишь ТЗ или СЗ. Хорошо бы реализовать заполнение объектных даных в 7.7
2. Gen Tay (GenTay) 10.10.14 21:43
3. trama 26.07.16 17:41
А как заполняется ТЗ из ТЗ? Не вижу цикла по строкам.
4. Владислав Томашевич (tomvlad) 26.07.16 19:36
(3) trama, при использовании метода используется текущая строка таблицы значений.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа