Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 10:08

Перебор данных в макете

Автор Andrey_123, 24 фев 2014, 10:30

0 Пользователей и 1 гость просматривают эту тему.

Andrey_123

Здравствуйте. Начну банально. Прошу не пинать начинающего программиста 1С. Вопрос следующий: Конфигурация ЗУП, есть общий макет ОКПДТР_Должности, который содержит код и наименование должности. Необходимо реализовать перебор данных макета для записи их в справочник.

lguandrey


Функция СформироватьИзМакетаТаблицуЗначений(Макет) Экспорт
Перем ТЗ;
ТЗ=Новый ТаблицаЗначений();

#Если Клиент Тогда
//Считываем столбцы
Для Стр=1 По Макет.ВысотаТаблицы Цикл
Если Стр>1 Тогда
ТекСтр=ТЗ.Добавить();
КонецЕсли;
ПустаяСтрока=истина;

Для НомерСтолбца=1 По Макет.ШиринаТаблицы Цикл
Яч=Макет.Область(Стр, НомерСтолбца);
Если Яч.СодержитЗначение Тогда
Зн=Яч.Значение;
Иначе
Зн=Яч.Текст;
КонецЕсли;
Если ТипЗнч(Зн)=Тип("Строка") И ПустаяСтрока(Зн) Тогда
Зн=Неопределено;
КонецЕсли;

//Добавляем столбец
Если Стр=1 Тогда
ТЗ.Колонки.Добавить(Зн,Новый ОписаниеТипов("Строка"));
Иначе
ТекСтр[НомерСтолбца-1]=Зн;
КонецЕсли;

КонецЦикла;
КонецЦикла;
#КонецЕсли
Возврат ТЗ;
КонецФункции

Andrey_123

lguandrey, если не затруднит прокомментируйте пожалуйста подробно ваш ответ

KrivosheevEV

Может, удобнее читать данные из ТЗ, на основании которой выводится макет?

AndreyKa

Цитата: Andrey_123 от 24 фев 2014, 11:16
lguandrey, если не затруднит прокомментируйте пожалуйста подробно ваш ответ
там просто выдернута откуда-то функция для примера, с мусором, да и неработающая в таком виде.
Вот рабочая функция с комментариями:
// Функция загружает данные из переданного макета в ТаблицуЗначений
//
Функция СформироватьИзМакетаТаблицуЗначений(Макет) Экспорт
// объявление переменных:
Перем ТЗ;
// инициализация переменных:
ТЗ=Новый ТаблицаЗначений();
//
#Если Клиент Тогда
//считываем столбцы макета
Для Стр=1 По Макет.ВысотаТаблицы Цикл
//НУМЕРАЦИЯ СТРОК:
// - с 1
//
// добавим новую строку в ТЗ:
ТекСтр=ТЗ.Добавить();
//
// считываем данные новой строки макета:
ПредыдущееЗн = "";
Для НомерСтолбца=1 По Макет.ШиринаТаблицы Цикл
//НУМЕРАЦИЯ СТОЛБЦОВ ТЗ:
// - с 0
//НУМЕРАЦИЯ СТОЛБЦОВ МАКЕТА:
// - с 1
//т.е. Макет.Столбец[1]=ТЗ.Столбец[0]
//
Яч=Макет.Область(Стр, НомерСтолбца);
// получим данные из текущей ячейки макета:
Если Яч.СодержитЗначение Тогда
//если ячейка области содержит значение:
Зн=Яч.Значение;
Иначе
Зн=Яч.Текст;
КонецЕсли; //Если Яч.СодержитЗначение Тогда ...
//
ТекЗн = Зн;
Если (ТипЗнч(Зн)=Тип("Строка") И ПустаяСтрока(Зн))
  ИЛИ (НЕ ПустаяСтрока(Зн) И Зн=ПредыдущееЗн) Тогда
//ПРИМЕЧАНИЕ: пустое значение ячейки ТЗ, если:
// - пустое значение в ячейке макета
// - текущее значение ячейки макета - копия предыдущего (важны только уникальные данные по строке, а не повторы!)
Зн="";
КонецЕсли; //Если (ТипЗнч(Зн)=Тип("Строка") И ПустаяСтрока(Зн)) ИЛИ ... Тогда ...
//
ПредыдущееЗн = ТекЗн;
//
//добавляем следующий столбец:
Если Стр=1 Тогда
ТЗ.Колонки.Добавить(, Новый ОписаниеТипов("Строка")); //имя колонки не указываем
КонецЕсли;
// заполняем ТЗ:
ТекСтр[НомерСтолбца-1]=Зн;
//
КонецЦикла; //Для НомерСтолбца=1 По Макет.ШиринаТаблицы Цикл ...
//
КонецЦикла; //Для Стр=1 По Макет.ВысотаТаблицы Цикл ...
#КонецЕсли
//
Возврат ТЗ;
//
КонецФункции //СформироватьИзМакетаТаблицуЗначений()

lolmatrix

Извините, но данный код возвращает пустую таблицу значений, я пробовал именно на общем макете из темы
Макет = ПолучитьОбщийМакет("КлассификаторОКПДТРДолжности");

lolmatrix

&НаСервере
Функция НайтиЗаписиВОКПДТР(ИмяКлассификатора)
КлассификаторXML = ПолучитьОбщийМакет(ИмяКлассификатора).ПолучитьТекст();
КлассификаторОКПДТР = ОбщегоНазначения.ПрочитатьXMLВТаблицу(КлассификаторXML).Данные;

Для каждого строкаКлассификатора из КлассификаторОКПДТР Цикл

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

&НаСервере
Процедура   ПодключитьсяИСкопировать()

// Поиск в первом макете
ИмяКлассификатора = "КлассификаторОКПДТРДолжности";

ОконченПоискВПервомМакете = НайтиЗаписиВОКПДТР(ИмяКлассификатора);
если ОконченПоискВПервомМакете тогда
// Поиск во втором макете
ИмяКлассификатора = "КлассификаторОКПДТРПрофессии";
НайтиЗаписиВОКПДТР(ИмяКлассификатора);

КонецЕсли;

Формасписка = Справочники.Должности.ПолучитьФормуСписка();
Если  ФормаСписка.Открыта() Тогда
ФормаСписка.Закрыть();
КонецЕсли;
ФормаСписка.Открыть();
Сообщить("Копирование Кодов окончено!  коды скопированы в справочник должности");


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

&НаКлиенте
Процедура СкопироватьКоды(Команда)


Элементы.СкопироватьКоды.Заголовок ="Обработка ждите...";
ОчиститьСообщения();
ПодключитьсяИСкопировать();

ПоказатьПредупреждение(,"Обработка окончена");

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



Делал для заполнения пустых кодов ОКПДТР  в справочнике должности

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск