Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Задвоеные элементы справочника
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.1 (8.0)
dcc3
Есть самописная база 1С 8.1. Необходимо найти элементы справочника ПолученныеНН с одинаковыми значениями реквизитов: Наименование + ИНН + СуммаСНДС.
Vofka
Записываете все данные в таблицу значений с, соответственными, 3 полями + 1 поле "Количество", в котором везде пишите 1. После того, как весь справочник будет туда записан - сворачиваете таблицу. Где количество больше 1 будет - это дубли.
dcc3
Спасибо за Ваш ответ. Но к сожалению я бухгалтер, а программирование в 1С начал осваивать недавно (нужда заставила). Нашел на форуме (http://pro1c.org.ua/index.php?showtopic=1936) описание по работе с таблицами значений, но разобраться сложновато. Пожалуйста если можете выложите примерный код.
Ardi
Как создать таблицу значений и заполнить ее поля?
Для создания таблицы значений используется оператор Новый (листинг 2.70):
Листинг 2.70. Создание таблицы значений
ТаблицаЗначений = Новый ТаблицаЗначений;


После этого можно создать колонки таблицы (при необходимости можно задать допустимые типы значений для колонки, заголовок и ширину колонки в символах), листинг 2.71.
Листинг 2.71. Создание колонок таблицы значений
// Создать нужные колонки.
ТаблицаЗначений.Колонки.Добавить("Фамилия");
ТаблицаЗначений.Колонки.Добавить("Возраст");

Затем можно добавить новую строку и установить значения в колонках таблицы следующим образом (листинг 2.72, 2.73):
Листинг 2.72. Добавление новой строки таблицы значений, используя явное указание имен колонок
// Добавить новую строку и задать значения в колонках таблицы.
НоваяСтрока = ТаблицаЗначений.Добавить();

НоваяСтрока.Фамилия = "Иванов";
НоваяСтрока.Возраст = 23;

Листинг 2.73. Добавление новой строки таблицы значений, используя переменные, хранящие имена колонок
// Добавить новую строку и задать значения в колонках таблицы.
НоваяСтрока = ТаблицаЗначений.Добавить();

НоваяСтрока["Фамилия"] = "Иванов";
НоваяСтрока["Возраст"] = 23;
i Как перебрать элементы справочника?
Для того чтобы перебрать элементы справочника, необходимо сформировать выборку элементов с нужными параметрами и затем обойти ее в цикле.
Например, для перебора всех элементов справочника Номенклатура в иерархическом порядке можно использовать следующий код (листинг 3.10):
Листинг 3.10. Перебор элементов справочника в порядке иерархии
Выборка = Справочники.Номенклатура.ВыбратьИерархически();

Пока Выборка.Следующий() Цикл
    Наименование = Выборка.Наименование;

    // Обращение к другим данным справочника.
    //    ...

КонецЦикла;
Аналогичного результата можно добиться, используя запрос (листинг 3.11):
Листинг 3.11. Перебор элементов справочника запросом
Запрос = Новый Запрос(
"ВЫБРАТЬ
|    Ссылка,
|    Наименование
|ИЗ
|    Справочник.Номенклатура
|АВТОУПОРЯДОЧИВАНИЕ");

Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
    Наименование = Результат.Наименование;
    //    ...
    
КонецЦикла;

Благодаря использованию запроса можно формировать выборку элементов справочника более «гибко», поскольку запрос позволяет задать произвольные условия на выбираемые данные.
dcc3
То есть насколько я понял можно осуществить перебор элементов справочника либо посредством создания таблицы значения, либо посредством выборки???
Vofka
Нельзя
Цитата
осуществить перебор элементов справочника посредством создания таблицы значения


Делается выборка или запрос и результат помещается в таблицу значений
dcc3
Цитата(Vofka @ 12.05.11, 6:51) необходимо зарегистрироваться для просмотра ссылки
Записываете все данные в таблицу значений с, соответственными, 3 полями + 1 поле "Количество", в котором везде пишите 1. После того, как весь справочник будет туда записан - сворачиваете таблицу. Где количество больше 1 будет - это дубли.

Хорошо. Создал и записал нужные данные в Таблицу значений, вывел в отчет. Все нормально. Создал дополнительное поле "Количество", но как записать 1 в каждую строку, в этом поле. И как свернуть таблицу.
Вотпрограммный код который у меня получился
                  ЭлементыФормы.ПолеТабличногоДокумента1.Очистить();
    ТабДок = ЭлементыФормы.ПолеТабличногоДокумента1;
    Макет = ОтчетОбъект.ПолучитьМакет("ДублиНН");

    ТаблицаЗначений = Новый ТаблицаЗначений;
    // Создаем нужные колонки.
    ТаблицаЗначений.Колонки.Добавить("ИНН");
    ТаблицаЗначений.Колонки.Добавить("Наименование");
    ТаблицаЗначений.Колонки.Добавить("НДС");
    ТаблицаЗначений.Колонки.Добавить("Количество");
    // Перебираем элемент справочника
    Выборка = Справочники.ПолученныеНН.Выбрать();
    
    Область = Макет.ПолучитьОбласть("Строка");
    Пока Выборка.Следующий() Цикл
        Область.Параметры.ИНН = Выборка.ИНН;
        Область.Параметры.Наименование = Выборка.Наименование;
        Область.Параметры.НДС = Выборка.НДС;
        ТабДок.Вывести(Область);
    КонецЦикла;
Vofka
  ЭлементыФормы.ПолеТабличногоДокумента1.Очистить();
    ТабДок = ЭлементыФормы.ПолеТабличногоДокумента1;
    Макет = ОтчетОбъект.ПолучитьМакет("ДублиНН");

    ТаблицаЗначений = Новый ТаблицаЗначений;
    // Создаем нужные колонки.
    ТаблицаЗначений.Колонки.Добавить("ИНН");
    ТаблицаЗначений.Колонки.Добавить("Наименование");
    ТаблицаЗначений.Колонки.Добавить("НДС");
    ТаблицаЗначений.Колонки.Добавить("Количество");
    // Перебираем элемент справочника
    Выборка = Справочники.ПолученныеНН.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        Строка = ТаблицаЗначений.Добавить();
        Строка.ИНН = Выборка.ИНН;
        Строка.Количество =  1;
        // остальные колонки заполните сами
    КонецЦикла;

    ТаблицаЗначений.Свернуть("ИНН, ОстальныеКолонкиЧерезЗапятую", "Количество");

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


Как-то так. На работоспособность не проверял. Но суть, я надеюсь, понятна.
dcc3
Большое спасибо. Все работает. Но не совсем так как хочется. Кроме трех основных полей ИНН, Наименование и НДС в справочнике есть еще 14 дополнительных полей (Например ДатаПолучения и Организация).
После выполнения строки
 ТаблицаЗначений.Свернуть("ИНН, Наименование, НДС", "Количество");

все данные сворачиваются, а в столбце "Количество" отображается количество одинаковых элементов согласно условий отбора. Это понятно. Но ДатаПолучения может быть разной, поэтому необходимо видить в отчете развернутые данные.
Zaval
Сделайте запросом.
Две таблички(обе - НН, в первой все нужные реквы, во второй - только критичные), связываете по критичным реквизитам и
...
|ИМЕЮЩИЕ
|        КОЛИЧЕСТВО(...) > 1
dcc3
Цитата(Zaval @ 17.05.11, 8:20) необходимо зарегистрироваться для просмотра ссылки
Сделайте запросом.
Две таблички(обе - НН, в первой все нужные реквы, во второй - только критичные), связываете по критичным реквизитам и
...
|ИМЕЮЩИЕ
|        КОЛИЧЕСТВО(...) > 1

Огромное спасибо всем откликнувшимся за понимание и терпение. Все получилось.
Выкладываю код
ВЫБРАТЬ
    ПолученныеНН.Наименование КАК Наименование,
    ПолученныеНН.ДатаПолученияНН,
    ПолученныеНН.ДатаВыпискиНН,
    ПолученныеНН.ВидДокумента,
    ПолученныеНН.Контрагент,
    ПолученныеНН.ИНН КАК ИНН,
    ПолученныеНН.СуммаСНДС,
    ПолученныеНН.База,
    ПолученныеНН.НДС,
    ПолученныеНН.БазаОсвобожден,
    ПолученныеНН.НДСОсвобожден,
    ПолученныеНН.БазаНеХоз,
    ПолученныеНН.НДСНеХоз,
    ПолученныеНН.БазаСт6,
    ПолученныеНН.НДССт6,
    ПолученныеНН.Организация,
    ПолученныеНН.ПорядковыйНомер
ИЗ
    Справочник.ПолученныеНН КАК ПолученныеНН
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПолученныеНН КАК ПолученныеНН1
        ПО ПолученныеНН.Наименование = ПолученныеНН1.Наименование
            И ПолученныеНН.ИНН = ПолученныеНН1.ИНН
            И ПолученныеНН.НДС = ПолученныеНН1.НДС
            И ПолученныеНН.НДСОсвобожден = ПолученныеНН1.НДСОсвобожден
            И ПолученныеНН.НДСНеХоз = ПолученныеНН1.НДСНеХоз
            И ПолученныеНН.НДССт6 = ПолученныеНН1.НДССт6
ГДЕ
    ПолученныеНН.ДатаПолученияНН МЕЖДУ &Дата1 И &Дата2
    И (ПолученныеНН.НДС <> 0
    ИЛИ ПолученныеНН.НДСОсвобожден <> 0
    ИЛИ ПолученныеНН.НДСНеХоз <> 0
    ИЛИ ПолученныеНН.НДССт6 <> 0)

СГРУППИРОВАТЬ ПО
    ПолученныеНН.ИНН,
    ПолученныеНН.Наименование,
    ПолученныеНН.НДС,
    ПолученныеНН.Организация,
    ПолученныеНН.ДатаПолученияНН,
    ПолученныеНН.ДатаВыпискиНН,
    ПолученныеНН.ВидДокумента,
    ПолученныеНН.Контрагент,
    ПолученныеНН.СуммаСНДС,
    ПолученныеНН.База,
    ПолученныеНН.БазаОсвобожден,
    ПолученныеНН.НДСОсвобожден,
    ПолученныеНН.БазаНеХоз,
    ПолученныеНН.НДСНеХоз,
    ПолученныеНН.БазаСт6,
    ПолученныеНН.НДССт6,
    ПолученныеНН.ПорядковыйНомер,
    ПолученныеНН1.Наименование,
    ПолученныеНН1.ИНН,
    ПолученныеНН1.НДС

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(ПолученныеНН.ИНН) > 1 И
    КОЛИЧЕСТВО(ПолученныеНН.НДС) > 1 И
    КОЛИЧЕСТВО(ПолученныеНН.Наименование) > 1 И
    КОЛИЧЕСТВО(ПолученныеНН.НДСОсвобожден) > 1 И
    КОЛИЧЕСТВО(ПолученныеНН.НДСНеХоз) > 1 И
    КОЛИЧЕСТВО(ПолученныеНН.НДССт6) > 1

УПОРЯДОЧИТЬ ПО
    ИНН,
    Наименование

Осталось дело за малым: вывести результат в отчет и настроить параметры печати. Так что тему можно считать закрытой.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.