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

24.07.14

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

Если вы используете в работе 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С Программист Платформа 1С v7.7 Конфигурации 1cv7 Бесплатно (free)

В статье расписаны примеры из жизни использования "Виртуального" работника. Разобраны вопросы, возникающие при работе с ним.

28.11.2021    1785    user707242_Gold_karas    18    

5

Механизмы платформы 1С Программист Платформа 1С v7.7 Абонемент ($m)

Пример построения программного кода для достижения функционала обратных вызовов (call back) во внешних обработках исключительно штатными средствами. Тестировалось на платформе 1с77 релиз 027. Конфигурация значения не имеет.

1 стартмани

06.10.2018    7730    Vortigaunt    5    

11

Механизмы платформы 1С Программист Оперативный учет 7.7 Абонемент ($m)

Когда занимаешься разработкой в среде 1С, редко задумываешься о том, что программным кодом ты работаешь с объектной моделью базы данных, а не с самой базой данных. И что это вообще разные вещи. Ты создаешь объекты: документы и справочники, записываешь их - и в базе данных появляются соответствующие записи. Это настолько привычно, что когда сталкиваешься с нетипичным поведением платформы, первым делом думаешь: надо протестировать базу, она битая. В этой статье я хочу разобрать одну интересную ситуацию, которая как раз демонстрирует такое поведение. Описанная ниже ситуация воспроизводится как в файловом, так и в клиент-серверном (SQL) варианте. Тестировалось на версии платформы 1с77 релиз 027.

1 стартмани

16.05.2018    10398    Vortigaunt    26    

5

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

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    95534    Serginio    116    

188

Механизмы платформы 1С Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

В 1С 8 наличие картинок товаров предусмотрено изначально, а в 7.7 такого нет. Проблема существует и ее исправляют, но это, как правило, частные случаи, касающиеся, например, печати прайса http://infostart.ru/public/289876/ , показу картинок в справочнике номенклатура http://infostart.ru/public/17125/, файловый менеджер картинок товара http://infostart.ru/public/15239/ или просто конфигурации работы с картинками http://infostart.ru/public/21142/ (не стремился дать полный обзор, поэтому не попавшие не обижайтесь :). Что не устроило – информация разбросана по статьям, необходимость дополнительно напрягаться, чтобы это заработало. Здесь я попытался собрать все «до кучи», а так же дать необходимые ссылки для желающих «копнуть вглубь».

1 стартмани

18.11.2014    44658    95    kitminsk    18    

20

Механизмы платформы 1С Программист Платформа 1С v7.7 Конфигурации 1cv7 Россия Бесплатно (free)

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

02.07.2012    18855    maxpiter    62    

15

Механизмы платформы 1С Программист Платформа 1С v7.7 Конфигурации 1cv7 Россия Абонемент ($m)

Описание принципов и набор инструментов для работы с двоичными данными в 1С 7.7. Примеры во вложениях.

1 стартмани

16.05.2012    32105    100    dusha0020    8    

22
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. fancy 35 25.07.14 05:04 Сейчас в теме
хм... в 1С 8.х ЗаполнитьЗначенияСвойств() больше полезно и наверное чаще используется для заполения реквизитов объектов (Справочник, Документ...), а здесь можно заполнить лишь ТЗ или СЗ. Хорошо бы реализовать заполнение объектных даных в 7.7
5. motetol 17.11.21 21:20 Сейчас в теме
    
ИначеЕсли (ТипЗначенияСтр(ДанныеПриемник) = "Справочник")
        И (ТипЗначенияСтр(ДанныеИсточник) = "Справочник") Тогда
             
		ВидСправочника = ДанныеПриемник.Вид();
		МетаданныеСправочника = Метаданные.Справочник(ВидСправочника);
		
		Для Т = 1 По МетаданныеСправочника.Реквизит() Цикл
			ИмяРеквизита = МетаданныеСправочника.Реквизит(Т).Идентификатор;
			
            Если (ПустоеЗначение(СписокСвойствСтрока) = 0)
                И (СписокСвойств.Принадлежит(ИмяРеквизита) = 0) Тогда

                Продолжить;

            КонецЕсли;

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

                Продолжить;

			КонецЕсли;
					
            ДанныеПриемник.Наименование = ДанныеИсточник.Наименование;
	
            Попытка
                ДанныеПриемник.УстановитьАтрибут(ИмяРеквизита,ДанныеИсточник.ПолучитьАтрибут(ИмяРеквизита));

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

    КонецЕсли;
Показать
2. GenTay 10.10.14 21:43 Сейчас в теме
Классная идея.Спасибо
3. trama 3 26.07.16 17:41 Сейчас в теме
А как заполняется ТЗ из ТЗ? Не вижу цикла по строкам.
4. tomvlad 3864 26.07.16 19:36 Сейчас в теме
(3) trama, при использовании метода используется текущая строка таблицы значений.
Оставьте свое сообщение