8.х Подскажите по поводу связанных документов

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем bajiepka, 18 ноя 2014.

  1. TopicStarter Overlay
    bajiepka
    Offline

    bajiepka Опытный в 1С

    Регистрация:
    26 сен 2014
    Сообщения:
    328
    Симпатии:
    22
    Баллы:
    29
    Доброго времени суток, уважаемые!
    1С 8.2, Комплексная автоматизация 1.1
    Помогите пожалуйста решить такую проблему:
    Необходимо вывести информацию о существовании (если они есть) связанных документов. Например на основании счета на оплату покупателю создаются документ в реализации товаров и услуг и платежное поручение входящее. В списке счетов на оплату я добавил поле и с помощью запроса получаю документ реализации товаров и услуг (если он существует):

    Функция ПолучитьПлюсыССервера(Плюс)

    Запрос = Новый Запрос;
    Запрос.Текст = "
    | ВЫБРАТЬ
    | РеализацияТоваровУслуг.Сделка КАК РеализацияТоваровУслугСделка,
    | РеализацияТоваровУслуг.Проведен КАК РеализацияТоваровУслугПроведен
    | ИЗ
    | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    | ГДЕ
    | РеализацияТоваровУслуг.Сделка <> Неопределено";


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

    Счетчик = 0;
    СчетчикПроводки = 0;

    Пока Выборка.Следующий() Цикл

    Если Плюс = Выборка.РеализацияТоваровУслугСделка Тогда
    Счетчик = Счетчик + 1;

    Если Выборка.РеализацияТоваровУслугПроведен Тогда
    СчетчикПроводки = СчетчикПроводки + 1;
    КонецЕсли;
    Иначе
    КонецЕсли;

    КонецЦикла;

    Возврат ?(Счетчик >= 1,
    "+" + " " + ?(СчетчикПроводки >= 1,"+","-"),
    "" + "");

    КонецФункции

    По аналогии хочу сделать с платежным поручением, но у него нет реквизита, который указывает на его документ-основание и ничего похожего.

    Подскажите как быть в этой ситуации?
  2. Dragnir
    Offline

    Dragnir Новичок в 1С

    Регистрация:
    22 окт 2014
    Сообщения:
    39
    Симпатии:
    8
    Баллы:
    4
    Доброго дня.

    Посмотри в табличные части документа Платежное поручение. 1С любит в типовых конфигурациях в документах банка добавлять табличные части, где хранится список сделок / договоров,
    по которым происходит оплата. В БП (Бухгалтерии Предприятия) по крайней мере точно так.

    А еще есть такой встроенный сервис, который называется "Структура подчиненности". Правда он не всегда дергает из базы все дерево... Но это уже другой вопрос.
    Можно еще там проверить и посмотреть.
    bajiepka нравится это.
  3. TopicStarter Overlay
    bajiepka
    Offline

    bajiepka Опытный в 1С

    Регистрация:
    26 сен 2014
    Сообщения:
    328
    Симпатии:
    22
    Баллы:
    29
    Точно) Есть реквизит "сделка" в ТЧ
  4. Dragnir
    Offline

    Dragnir Новичок в 1С

    Регистрация:
    22 окт 2014
    Сообщения:
    39
    Симпатии:
    8
    Баллы:
    4
    Ну таки да )))
  5. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    Есть еще такая штука - Критерии отбора, можно через них заморочиться.
  6. TopicStarter Overlay
    bajiepka
    Offline

    bajiepka Опытный в 1С

    Регистрация:
    26 сен 2014
    Сообщения:
    328
    Симпатии:
    22
    Баллы:
    29
    Всё получилось и работает как надо. Но есть еще такой вопрос, мне подсознательно кажется, что форма списка счетов открывалась быстрее (если раньше открывалась моментально, то сейчас лишняя доля секунды, но есть). Дело в том, что у меня при проставлении необходимых ключей вызываются две процедуры, каждая из которых вызывает серверную процедуру с запросом. Код вот такой:

    //&НаСервере
    Функция ЗапроситьСчет()

    ЗапросСчетов = Новый Запрос;
    ЗапросСчетов.Текст = "
    | ВЫБРАТЬ
    | ДокТабЧасть.Сделка КАК ПоручениеСделка,
    | ПлатежноеПоручениеВходящее.Проведен КАК ПоручениеПроведено
    | ИЗ
    | Документ.ПлатежноеПоручениеВходящее КАК ПлатежноеПоручениеВходящее
    | ЛЕВОЕ СОЕДИНЕНИЕ
    | Документ.ПлатежноеПоручениеВходящее.РасшифровкаПлатежа КАК ДокТабЧасть
    | ПО
    | ПлатежноеПоручениеВходящее.Ссылка = ДокТабЧасть.Ссылка
    | ГДЕ
    | ДокТабЧасть.Сделка <> Неопределено";

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

    Возврат РезультатЗапросаСчетов;

    КонецФункции

    --------------------------------------------------------------------------------------------------------------------------------

    //&НаСервере
    Функция ЗапроситьНакладные()

    ЗапросНакладных = Новый Запрос;
    ЗапросНакладных.Текст = "
    | ВЫБРАТЬ
    | РеализацияТоваровУслуг.Сделка КАК РеализацияТоваровУслугСделка,
    | РеализацияТоваровУслуг.Проведен КАК РеализацияТоваровУслугПроведен
    | ИЗ
    | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    | ГДЕ
    | РеализацияТоваровУслуг.Сделка <> Неопределено";

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

    Возврат РезультатЗапросаНакладных;

    КонецФункции

    --------------------------------------------------------------------------------------------------------------------------------

    Функция ПолучитьНакладные(Плюс)

    РезультатЗапросаНакладных = ЗапроситьНакладные();

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

    СчетчикНакладных = 0;
    СчетчикПроводкиНакладных = 0;

    Пока ВыборкаЗапросаНакладных.Следующий() Цикл

    Если Плюс = ВыборкаЗапросаНакладных.РеализацияТоваровУслугСделка Тогда
    СчетчикНакладных = СчетчикНакладных + 1;

    Если ВыборкаЗапросаНакладных.РеализацияТоваровУслугПроведен Тогда
    СчетчикПроводкиНакладных = СчетчикПроводкиНакладных + 1;
    КонецЕсли;
    Иначе
    КонецЕсли;

    КонецЦикла;

    Возврат ?(СчетчикНакладных >= 1,
    "+" + " " + ?(СчетчикПроводкиНакладных >= 1,"+","-"),
    "" + "");

    КонецФункции

    --------------------------------------------------------------------------------------------------------------------------------

    Функция ПолучитьСчета(Плюс)

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

    СчетчикСчетов = 0;
    СчетчикПроводкиСчетов = 0;

    Пока ВыборкаЗапросаСчетов.Следующий() Цикл

    Если Плюс = ВыборкаЗапросаСчетов.ПоручениеСделка Тогда
    СчетчикСчетов = СчетчикСчетов + 1;

    Если ВыборкаЗапросаСчетов.ПоручениеПроведено Тогда
    СчетчикПроводкиСчетов = СчетчикПроводкиСчетов + 1;
    КонецЕсли;
    Иначе
    КонецЕсли;

    КонецЦикла;

    Возврат ?(СчетчикСчетов >= 1,
    "+" + " " + ?(СчетчикПроводкиСчетов >= 1,"+","-"),
    "" + "");

    КонецФункции

    У меня в списке формы сейчас 40 документов. Т.е. как я понимаю для того, чтобы проставить все ключи два запроса вызываются по 40 раз, в сумме 80. В теории если документов будет 1000, а их может быть и больше, то будет 2000 запросов и т.д. ... Запросы одинаковые и мне кажется, что можно обойтись двумя. Я попробовал создать переменную в модуле формы списка, чтобы закинуть туда результаты выполнения запроса (например в начале модуля: Перем ЗСчетов), но никак не могу потом оттуда вытащить результат запроса и пройтись по нему циклом.

    Не уничтожайте меня пожалуйста своими комментами :) чую, что здесь всё не сложно. Подскажите как это сделать :confused:
  7. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    Напишите 1 запрос для динамического списка и используйте его, должно быть оптимальнее в плане производительности.
  8. Dragnir
    Offline

    Dragnir Новичок в 1С

    Регистрация:
    22 окт 2014
    Сообщения:
    39
    Симпатии:
    8
    Баллы:
    4
    При этом есть еще такой флажок при настройке динамического списка, как "динамическое считывание данных".

Поделиться этой страницей