1с как найти документы на основании

Как Запросом выбрать данные Документа-Основания?

Автор Nail2010, 28 фев 2011, 10:45

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

Добрый день!
Вопрос может и на удивление простой, но все таки…
На основании документов «РеализацияТоваровУслуг» и «ЗаказПокупателя» вводиться «Приходно-кассовый ордер»
Текст моего запроса: «ВЫБРАТЬ
                |   ПриходныйКассовыйОрдер.ДокументОснование.Ссылка
                |ИЗ
                |   Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер»;

Нужно то всего — условие ГДЕ — ДокументОснование.Ссылка= ?????????? Что? (&Ссылка, &ДокументОснованиеСсылка?)
И самое противное — как установить параметр, нужный для данной выборки?
И вторая половина задачи — В реквизите КОММЕНТАРИЙ этих 2-х документов — оснований нужно программно прописать «Приходный кассовый ордер»… тип реквизита, конечно, строка.
Жду ваших вариантов!


Приветствую!
Это Вы запрос где пишете? В обработке заполнения?
И зачем Вам запрос? Запросом вы не получите никакое Основание, его нет в базе, оно есть только в обработке заполнения нового объекта, и после записи вы уже не узнаете, на основании чего был создан документ.

Если писать в Обработке заполнения ПКО, то там есть параметр Основание. К нему и нужно обращаться. Основание — это уже и будет ссылка на документ РТУ или ЗаказПокупателя.

Чтобы прописать Комментарий:

ДокОснование=Основание.ПолучитьДокумент();
ДокОснование.Комментарий="Пишем нужный нам комментарий";
ДокОснование.Записать();

xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь…

Мысль — это оргазм мозга. Кто способен его испытать — получают истинное наслаждение, остальным приходится имитировать


В ПКО надо завести реквизит ДокументОснование и заполнять его в ОбработкеЗаполнения

ДокументОснование = Основание.Ссылка;

По другому никак не узнаете документ-основание.

Задача 2. После изменений (см. выше) перебирайте все ПКО и по реквизиту ДокументОснование получайте нужный документ и устанавливайте нужный комментарий…

Получил помощь — скажи СПАСИБО.
Разобрался сам — расскажи другим.


ЦитироватьВ ПКО надо завести реквизит ДокументОснование и заполнять его в ОбработкеЗаполнения

Это только если в дальшнейшем нужно хранить ссылку на документ-основание. Но как правило, достаточно знания документа-основания в момент обработки заполнения нового объекта.

Я так понимаю, вся задача изначально состояла в том, чтобы при вводе на основании в доке-основании прописывался комментарий. Тогда не вижу смысла добавлять еще и реквизит.

xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь…

Мысль — это оргазм мозга. Кто способен его испытать — получают истинное наслаждение, остальным приходится имитировать


У него еще Задача1 — в запросе каким то образом отбирать по документу-основанию…

Получил помощь — скажи СПАСИБО.
Разобрался сам — расскажи другим.


Хотя… Если Задача1 нужна для осуществления Задачи2…
То вполне можно обойтись и без реквизита…

Получил помощь — скажи СПАСИБО.
Разобрался сам — расскажи другим.


Реквизит в обоих документах добавлен изначально, в этом то и фишка. Спасибо за ответ! Насчет коммента — ценная информация.
Заказ клиента таков: После ввода примерно 10000 документов начальство решило отсортировать Заказы покупателей и реализациюТоваровУслуг. Условие сортировки — Отобрать те документы, на основании которых вводился «Приходный кассовый ордер». В иотге данные обработки имеют следующий вид: На 100 записей «Заказа Покупателей» приводиться 2 записи «реализацияТоваровУслуг». Данные выводяться в таблицу следующим кодом:

                               Выборка=Запрос.Выполнить().Выбрать();         
   Пока Выборка.Следующий() Цикл;
      СтрокаТабличнойЧасти=ДокВыбор.Добавить();
      СтрокаТабличнойЧасти.ЗаказПокупателя=Выборка.ДокументОснованиеСсылка;
   КонецЦикла;
   Запрос2=Новый Запрос;
   запрос2.Текст=»ВЫБРАТЬ
                 |   ПриходныйКассовыйОрдер.ДокументОснование.Ссылка
                 |ИЗ
                 |   Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер»;
   Выборка=Запрос2.Выполнить().Выбрать();
   Пока Выборка.Следующий() Цикл;
      СтрокаТабличнойЧасти=ТоварыУслуги.Добавить();
      СтрокаТабличнойЧасти.РеализацияТоваровИУслуг=выборка.ДокументОснованиеСсылка;

теперь моя задача — освободиться от ненужных пустых строк…. в этом то и суть.


2 cska-fanat-kz
меня терзают смутные сомнения, что отобрать по документу-основанию товарисч хотел именно текущий документ-основание, чтобы прописать комментарий… но для этих целей запрос вовсе и не обязателен.

Ждем аффтара…

xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь…

Мысль — это оргазм мозга. Кто способен его испытать — получают истинное наслаждение, остальным приходится имитировать


А забыл сказать что в табличной части типы реквизитов разные — один Докссылка Заказ покупателей, а другой — соответственно ДокСсылка РеализацияТоваров…


Что значит «в обоих документах»?

Реквизит ДокументОснование находится в ОДНОМ документе ПКО!
А вот значений может быть 2 — ДокументСсылка.Реализация и ДокументСсылка.Заказ.

«теперь моя задача — освободиться от ненужных пустых строк….»
Вот этом случае ИМХО без реквизита не обойтись…

Получил помощь — скажи СПАСИБО.
Разобрался сам — расскажи другим.


Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

/// Как выбрать и упорядочить документы за период
/// в 1с 8.3, 8.2
 
&НаСервере
Процедура КакВыбратьИУпорядочитьДокументыЗаПериодНаСервере()
 
    // найдём все документы поступления еды за 2014 год
    // упорядочив их по возрастанию даты
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Ссылка
        |ИЗ
        |   Документ.ПоступлениеЕды КАК ПоступлениеЕды
        |ГДЕ
        |   Дата МЕЖДУ &НачДата И &КонДата
        |УПОРЯДОЧИТЬ ПО
        |   Дата ВОЗР";
 
    Запрос.УстановитьПараметр("НачДата", '20140101');
    Запрос.УстановитьПараметр("КонДата", '20141231');
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДокументов = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДокументов.Следующий() Цикл
        Сообщить(ВыборкаДокументов.Ссылка);
    КонецЦикла;
 
КонецПроцедуры
 
/// Как найти документ по номеру в 1с 8.3, 8.2
 
&НаСервере
Процедура КакНайтиДокументПоНомеруНаСервере()
 
    // найдём поступление еды № ВМБП-000005 за 2014 год
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Ссылка
        |ИЗ
        |   Документ.ПоступлениеЕды КАК ПоступлениеЕды
        |ГДЕ
        |   Дата МЕЖДУ &НачДата И &КонДата И
        |   Номер = &ВыбНомер";
 
    Запрос.УстановитьПараметр("НачДата", '20140101');
    Запрос.УстановитьПараметр("КонДата", '20141231');
    Запрос.УстановитьПараметр("ВыбНомер", "ВМБП-000005");
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДокументов = РезультатЗапроса.Выбрать();
 
    Если ВыборкаДокументов.Следующий() Тогда
        Сообщить(ВыборкаДокументов.Ссылка);        
    Иначе
        Сообщить("Документ с таким номером не существует!");
    КонецЕсли;
 
КонецПроцедуры
 
/// Как найти документы по реквизиту в 1с 8.3, 8.2
 
&НаСервере
Процедура КакНайтиДокументПоРеквизитуНаСервере()
 
    // найдём все документы поступления еды
    // от поставщика ООО "Поле"
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Ссылка,
        |   Поставщик
        |ИЗ
        |   Документ.ПоступлениеЕды КАК ПоступлениеЕды
        |ГДЕ
        |   Поставщик = &ВыбПоставщик
        |УПОРЯДОЧИТЬ ПО
        |   Дата ВОЗР";
 
    Запрос.УстановитьПараметр(
        "ВыбПоставщик",
        Справочники.Поставщики.НайтиПоНаименованию("ООО ""Поле""")
    );
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДокументов = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДокументов.Следующий() Цикл        
        Сообщить(
            Строка(ВыборкаДокументов.Ссылка) + " " + 
            ВыборкаДокументов.Поставщик
        );
    КонецЦикла;
 
КонецПроцедуры
 
/// Как выбрать все документы, которые не проведены и
/// не помечены на удаление в 1с 8.3, 8.2
 
&НаСервере
Процедура КакВыбратьВсеДокументыКоторыеНеПроведеныИНеПомеченыНаУдалениеНаСервере()
 
    // найдём не проведенные и не помеченные на удаление
    // документы поступления еды
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Ссылка,
        |   Проведен,
        |   ПометкаУдаления        
        |ИЗ
        |   Документ.ПоступлениеЕды КАК ПоступлениеЕды
        |ГДЕ
        |   Проведен = ЛОЖЬ И
        |   ПометкаУдаления = ЛОЖЬ
        |УПОРЯДОЧИТЬ ПО
        |   Дата ВОЗР";
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДокументов = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДокументов.Следующий() Цикл
        Сообщить(
            Строка(ВыборкаДокументов.Ссылка) + " " + 
            ВыборкаДокументов.Проведен + " " +
            ВыборкаДокументов.ПометкаУдаления
        );
    КонецЦикла;
 
КонецПроцедуры
 
/// Как найти подчиненные документы в 1с 8.3, 8.2
 
&НаСервере
Процедура КакНайтиПодчиненныеДокументыНаСервере()
 
    // Рассмотрим работу с подчиненными (связанными) документами
    // на примере документов: ПоступлениеТоваровУслуг и СчетФактураПолученный.
 
    // Документ СчетФактураПолученный вводится на основании документа
    // ПоступлениеТоваровУслуг, то есть счет фактура является подчиненной
    // по отношению к поступлению.
 
    // Факт подчиненности обычно (в типовых) фиксируется в самом подчиненном
    // документе через табличную часть ДокументыОснования.
    // Почему через табличную часть? Потому что один документ может зависеть
    // (быть подчиненным) сразу от нескольких родителей (оснований).
 
    // Пример №1.
    // У нас есть ссылка на поступление товаров и услуг. Требуется найти
    // счёт-фактуры, которые были введены на основании этого поступления.
    // В дереве подчиненности эти фактуры будут подчинены (зависимы) от
    // документа поступления.
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Ссылка
        |ИЗ
        |    Документ.СчетФактураПолученный.ДокументыОснования КАК
        |    СчетФактураПолученныйДокументыОснования
        |ГДЕ
        |    СчетФактураПолученныйДокументыОснования.ДокументОснование =
        |    &ВыбПоступление";
 
    Запрос.УстановитьПараметр("ВыбПоступление", 
        Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру("0000-000004", '20160101')
    );
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        ПодчиненнаяФактура = ВыборкаДетальныеЗаписи.Ссылка;
        Сообщить(ПодчиненнаяФактура);
    КонецЦикла;
 
    // Пример №2.
    // У нас есть ссылка на счет-фактуру полученную. Требуется найти,
    // документы, на основании которых она была введена (родителей).
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ДокументОснование
        |ИЗ
        |    Документ.СчетФактураПолученный.ДокументыОснования КАК
        |    СчетФактураПолученныйДокументыОснования
        |ГДЕ
        |    СчетФактураПолученныйДокументыОснования.Ссылка =
        |    &ВыбСчетФактура";
 
    Запрос.УстановитьПараметр("ВыбСчетФактура",
        Документы.СчетФактураПолученный.НайтиПоНомеру("0000-000007", '20160101')
    );
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        РодительФактуры = ВыборкаДетальныеЗаписи.ДокументОснование;
        Сообщить(РодительФактуры);
    КонецЦикла;
 
КонецПроцедуры
 
///  Как перебрать (перечислить) строки табличной части документа в 1с 8.3, 8.2
 
&НаСервере
Процедура КакПеречислитьСтрокиИзТабличнойЧастиДокументаНаСервере()
 
    // У документа ПоступлениеЕды есть табличная часть 'Еда'.
    // У этой табличной части есть колонки: Номенклатура, Количество,
    // Сумма.
 
    ПоступлениеСсылка = 
        Документы.ПоступлениеЕды.НайтиПоНомеру(
            "ВМБП-000002", '20141231');    
 
    // перечислим строки табличной части этого документа
 
    // при помощи объектной техники
 
    Для Каждого Строка Из ПоступлениеСсылка.Еда Цикл
        Сообщить(
            Строка.Номенклатура.Наименование + " " +
            Строка.Количество + " шт. " + 
            Строка.Сумма + " руб."
        );
    КонецЦикла;
 
    // при помощи запроса    
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ПоступлениеЕдыЕда.Номенклатура,
        |   ПоступлениеЕдыЕда.Количество,
        |   ПоступлениеЕдыЕда.Сумма
        |ИЗ
        |   Документ.ПоступлениеЕды.Еда КАК ПоступлениеЕдыЕда
        |ГДЕ
        |   ПоступлениеЕдыЕда.Ссылка = &ВыбПоступление";
 
    Запрос.УстановитьПараметр("ВыбПоступление", ПоступлениеСсылка);
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
 
        Сообщить(
            ВыборкаДетальныеЗаписи.Номенклатура.Наименование + " " +
            ВыборкаДетальныеЗаписи.Количество + " шт. " + 
            ВыборкаДетальныеЗаписи.Сумма + " руб."
        );
 
    КонецЦикла;
 
КонецПроцедуры
 
&НаСервере
Процедура СозданиеИИзменениеДокументовНаСервере()
 
    /// Как создать новый документ в 1с 8.3, 8.2
 
    // создадим новый документ поступление еды
    Поступление = Документы.ПоступлениеЕды.СоздатьДокумент();
    // заполним шапку документа
    Поступление.Дата = ТекущаяДата();
    Поступление.Поставщик = 
        Справочники.Поставщики.НайтиПоНаименованию(
            "ООО ""Кузбас"""
        );
    Поступление.Склад =
        Справочники.Склады.НайтиПоНаименованию(
            "Основной"
        );
    // заполним табличную часть Еда
    НоваяСтрока = Поступление.Еда.Добавить();
    НоваяСтрока.Номенклатура =
        Справочники.Еда.НайтиПоНаименованию(
            "Банан"
        );
    НоваяСтрока.Количество = 10;
    НоваяСтрока.Сумма = 550;
 
    /// Как записать документ в 1с 8.3, 8.2
 
    Поступление.Записать(РежимЗаписиДокумента.Запись);
 
    /// Как провести документ в 1с 8.3, 8.2
 
    Поступление.Записать(РежимЗаписиДокумента.Проведение);
 
    /// Как отменить проведение документа в 1с 8.3, 8.2
 
    Поступление.Записать(РежимЗаписиДокумента.ОтменаПроведения);
 
    /// Как внести изменения в документ по ссылке в 1с 8.3, 8.2
 
    // зачастую у нас есть только ссылка на документ
    // и чтобы по ней получить сам объект документа
    // для изменения нужно вызывать метод ПолучитьОбъект
 
    // найдём документ продажа еды под номером ВМБП-000001
    // для лаконичности примера воспользуемся не запросом,
    // а объектной техникой
 
    СсылкаНаПродажу = Документы.ПродажаЕды.НайтиПоНомеру(
        "ВМБП-000001",
        '20141231' // поиск среди документов 2014 года
     );
    // нам вернули не сам документ, а ссылку (указатель) на него
 
    // проверим - нашёлся ли вообще документ    
    Если СсылкаНаПродажу.Пустая() Тогда
        Сообщить("Документ не найден.");
    Иначе
        // получим сам документ по ссылке
        Продажа = СсылкаНаПродажу.ПолучитьОбъект();
        // вот его уже можно изменять и записывать
        Продажа.Клиент = 
            Справочники.Клиенты.НайтиПоНаименованию(
                "Пётр"
            );
        Продажа.Записать();
    КонецЕсли;
 
    /// Как получить пустую ссылку типа документ в 1с 8.3, 8.2
 
    ПустаяСсылка = Документы.ПродажаЕды.ПустаяСсылка();
    Если ПустаяСсылка.Пустая() Тогда
        Сообщить("Ссылка действительно пустая.");
    КонецЕсли;
 
    /// Как скопировать существующий документ в 1с 8.3, 8.2
 
    // скопируем найденный документ на продажу и запишем
    // как новый документ от сегодняшнего числа
 
    КопияПродажи = СсылкаНаПродажу.Скопировать();
    КопияПродажи.Дата = ТекущаяДата();
    КопияПродажи.Комментарий = "Копия документа " + 
        Строка(СсылкаНаПродажу);
    // запишем и проведём документ
    КопияПродажи.Записать(РежимЗаписиДокумента.Проведение);
 
    /// Как заблокировать документ перед изменениями 
    /// в 1с 8.3, 8.2
 
    // выполним блокировку документа
    // от изменения другими режимами или пользователями
 
    Продажа = СсылкаНаПродажу.ПолучитьОбъект();
    Если Не Продажа.Заблокирован() Тогда
        Продажа.Заблокировать();
        // тут идёт какой-то долгий алгоритм
        // в результате которого мы меняем
        // заблокированный элемент
        Продажа.Комментарий = "Документ изменён.";
        Продажа.Записать();
        // и только потом освобождаем его
        // для других режимов и пользователей
        Продажа.Разблокировать();
    КонецЕсли;
 
    /// Как создать новый документ на основании другого объекта
    /// в 1с 8.3, 8.2
 
    // создадим документ продажа на основании поступления
    // скопировав из поступления табличную часть
 
    // в модуле документа ПродажаЕды я определил процедуру
    // ОбработкаЗаполнения, которая обрабатывает ситуации
    // когда мы заполняем один элемент на основании
    // данных другого (см. в базе для скачивания)
 
    ПродажаНаОсновании = Документы.ПродажаЕды.СоздатьДокумент();
    ПродажаНаОсновании.Дата = ТекущаяДата();
    ПродажаНаОсновании.Комментарий =
        "Документ введён на основании " + Строка(Поступление.Ссылка);
    ПродажаНаОсновании.Заполнить(Поступление.Ссылка);
    ПродажаНаОсновании.Записать(РежимЗаписиДокумента.Проведение);
 
    /// Как пометить на удаление документ в 1с 8.3, 8.2
 
    ПродажаНаОсновании.УстановитьПометкуУдаления(Истина);
    // метод Записать вызывать не нужно
 
КонецПроцедуры
 
/// Как найти и изменить программно движения документа
/// по регистрам в 1с 8.3, 8.2
 
&НаСервере
Процедура КакНайтиИИзменитьДвиженияДокументаНаСервере()
 
    // предположим у нас есть ссылка на проведенный
    // документ поступления еды № ВМБП-000002
 
    ПоступлениеСсылка = 
        Документы.ПоступлениеЕды.НайтиПоНомеру(
            "ВМБП-000002", '20141231');
 
    // мы знаем, что этот документ делает записи по
    // двум регистрам:
    // - регистр накопления "ЗапасЕды"
    // - регистр бухгалтерии "Хозрасчетный"
 
    // наша задача: найти записи по регистру "ЗапасЕды"
    // изменить их (например, удвоим количество)
    // и записать вместо старых
 
    // используем объектную технику получения движений,
    // ведь мы будем их изменять
 
    Поступление = ПоступлениеСсылка.ПолучитьОбъект();
 
    // получим набор записей этого документа в регистр ЗапасыЕды
    НаборЗаписей = Поступление.Движения.ЗапасыЕды;
 
    // прочитаем записи из базы данных
    НаборЗаписей.Прочитать();
 
    Для Каждого Запись Из НаборЗаписей Цикл
 
        // выведем старые значения
        Сообщить(
            Строка(Запись.ВидДвижения) + " " +
            Запись.Еда + " " + Запись.Количество
        );
 
        // изменим запись, удвоив количество
        Запись.Количество = Запись.Количество * 2;
 
    КонецЦикла;
 
    // добавим новую запись
    НоваяЗапись = НаборЗаписей.ДобавитьПриход();    
    НоваяЗапись.Склад = 
        Справочники.Склады.НайтиПоНаименованию("Основной");
    НоваяЗапись.Еда = 
        Справочники.Еда.НайтиПоНаименованию("Банан");
    НоваяЗапись.Количество = 3;
    НоваяЗапись.Период = ТекущаяДата();
 
    // разом запишем набор записей
    НаборЗаписей.Записать(
        Истина // удалим старые движения и запишем вместо них новые
    );
 
    // теперь движения документа № ВМБП-000002 отличаются от тех,
    // что были записаны документом при проведении
    // чтобы вернуть их к начальному виду - нужно
    // перепровести документ
 
КонецПроцедуры
 
/// Как прочитать движения документа по регистрам запросом
/// в 1с 8.3, 8.2
 
&НаСервере
Процедура КакПрочитатьДвиженияДокументаЗапросомНаСервере()
 
    // этот приём используется, если не требуется изменять
    // найденные записи    
 
    // предположим у нас есть ссылка на проведенный
    // документ поступления еды № ВМБП-000002
 
    ПоступлениеСсылка = 
        Документы.ПоступлениеЕды.НайтиПоНомеру(
            "ВМБП-000002", '20141231');
 
    // мы знаем, что этот документ делает записи по
    // двум регистрам:
    // - регистр накопления "ЗапасЕды"
    // - регистр бухгалтерии "Хозрасчетный"
 
    // прочитаем записи по регистру "ЗапасЕды" запросом
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ЗапасыЕды.НомерСтроки,
        |   ЗапасыЕды.ВидДвижения,
        |   ЗапасыЕды.Еда,
        |   ЗапасыЕды.Количество
        |ИЗ
        |   РегистрНакопления.ЗапасыЕды КАК ЗапасыЕды
        |ГДЕ
        |   ЗапасыЕды.Регистратор = &ВыбРегистратор
        |
        |УПОРЯДОЧИТЬ ПО
        |   ЗапасыЕды.НомерСтроки";
 
    Запрос.УстановитьПараметр("ВыбРегистратор", ПоступлениеСсылка);
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Сообщить(
            "#" + ВыборкаДетальныеЗаписи.НомерСтроки +
            " " + ВыборкаДетальныеЗаписи.ВидДвижения +
            " " + ВыборкаДетальныеЗаписи.Еда + 
            " " + ВыборкаДетальныеЗаписи.Количество
        );
    КонецЦикла;
 
КонецПроцедуры
 
/// Как изменить проведенный документ, не меняя его
/// движений (проводок) в 1с 8.3, 8.2
 
&НаСервере
Процедура КакИзменитьПроведенныйДокументНеМеняяЕгоДвиженийНаСервере()
 
    // бывает так, что есть проведенный документ
    // в уже закрытом периоде и нужно изменить
    // некоторое поле документа, но так чтобы
    // не поменялись проводки документа
 
    ПоступлениеСсылка = 
        Документы.ПоступлениеЕды.НайтиПоНомеру(
            "ВМБП-000005", '20141231');
 
    // Изменим количество в табличной части этого документа
    // на 1, но чтобы проводки (движения) остались прежними
 
    Поступление = ПоступлениеСсылка.ПолучитьОбъект();
 
    Для Каждого Строка Из Поступление.Еда Цикл
        Строка.Количество = 1;
    КонецЦикла;
 
    // если сейчас просто записать документ
    // изменятся его проводки, ведь он уже проведён
 
    // но если установить флаг Загрузка
    Поступление.ОбменДанными.Загрузка = Истина;    
 
    // то можно записать проведенный документ
    // без повторного проведения
 
    Поступление.Записать();
 
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция ПолучитьПродажуПоНомеру(Номер, Интервал)
 
    Возврат Документы.ПродажаЕды.НайтиПоНомеру(
        Номер, Интервал
    );
 
КонецФункции
 
/// Как открыть форму существующего документа 
/// по ссылке в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуСуществующегоДокумента(Команда)
 
    СсылкаНаДокумент = ПолучитьПродажуПоНомеру("ВМБП-000006", '20141231');
 
    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
 
    ОткрытьФорму(
        "Документ.ПродажаЕды.ФормаОбъекта", // имя формы
        ПараметрыФормы // параметры для формы
    );
 
КонецПроцедуры
 
/// Как открыть форму выбора документа и
/// отследить её закрытие в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуВыбораДокумента(Команда)
 
    ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораДокумента",
        ЭтотОбъект);
 
    ОткрытьФорму(
        "Документ.ПродажаЕды.ФормаВыбора",,,,,,ОповещениеОЗакрытии        
    );
 
КонецПроцедуры
 
&НаКлиенте
Процедура ПослеВыбораДокумента(Результат, Параметры) Экспорт
 
    Если Результат <> Неопределено Тогда
        Сообщить("Был выбран документ " + Результат);
    КонецЕсли;
 
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция НайтиПоставщикаПоИмени(Имя)
 
    Возврат Справочники.Поставщики.НайтиПоНаименованию(
        Имя
    );
 
КонецФункции
 
/// Как открыть форму списка (журнал) документов и
/// с отбором по реквизиту в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуСпискаДокументовСОтбором(Команда)
 
    // откроем список поступлений, оставив
    // только те, что от поставщика ООО "Поле"
 
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Поставщик",
        НайтиПоставщикаПоИмени("ООО ""Поле"""));
 
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
 
    ОткрытьФорму(
        "Документ.ПоступлениеЕды.ФормаСписка",
        ПараметрыФормы
    );
 
КонецПроцедуры
 
/// Как открыть форму только что созданного, но ещё
/// не записанного документа в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуНовогоНеЗаписанногоДокумента(Команда)
 
    // получаем форму нового документа
    ФормаНовогоДокумента = ПолучитьФорму(
        "Документ.ПоступлениеЕды.ФормаОбъекта",,, Истина); 
 
    // делаем копию её данных (так как напрямую их менять
    // нельзя)
    КопияДанныхФормы = ФормаНовогоДокумента.Объект;
 
    // заполняем эти данные на сервере
    ЗаполнитьДанныеФормыНаСервере(КопияДанныхФормы);    
 
    // копируем заполненные данные в исходную форму
    КопироватьДанныеФормы(КопияДанныхФормы,
        ФормаНовогоДокумента.Объект);
 
    // показываем форму нового заполненного
    // документа пользователю
    ФормаНовогоДокумента.Открыть();
 
КонецПроцедуры
 
&НаСервере
Процедура ЗаполнитьДанныеФормыНаСервере(ДанныеФормы)
 
    // преобразуем данные формы в документ
    Поступление = ДанныеФормыВЗначение(ДанныеФормы,
        Тип("ДокументОбъект.ПоступлениеЕды"));
 
    // заполним только табличную часть
    НоваяСтрока = Поступление.Еда.Добавить();
    НоваяСтрока.Номенклатура =
        Справочники.Еда.НайтиПоНаименованию(
            "Банан"
        );
    НоваяСтрока.Количество = 10;
    НоваяСтрока.Сумма = 550;
 
    // преобразуем документа обратно в данные формы
    ЗначениеВДанныеФормы(Поступление, ДанныеФормы);
 
КонецПроцедуры
 
/// Скачать и выполнить эти примеры на компьютере

Войти или зарегистрироваться

[РЕШЕНО] Как получить документ-основание?

Тема в разделе «Конфигурирование на платформе «1С:Предприятие 8″», создана пользователем Dendik, 15 апр 2014.




0/5,
Голосов: 0
  1. TopicStarter Overlay

    Dendik

    Offline

    Dendik
    Опытный в 1С

    Регистрация:
    12 фев 2010
    Сообщения:
    55
    Симпатии:
    0
    Баллы:
    26

    Добрый день! Помогите решить задачу. Есть документ «Реализация товаров и услуг», созданный на основании документа «Счет на оплату покупателю» Как вытащить документ-основание?


    Dendik,
    15 апр 2014
    #1

  2. Tiger86

    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104

    в обработке заполнения ДанныеЗаполнения вроде как, а так как реквизит хранить наверное надо

    — Объединение сообщений, 15 апр 2014

    в документе Реализация товаров и услуг посмотрите реквизит ДокументОснование


    Tiger86,
    15 апр 2014
    #2
  3. TopicStarter Overlay

    Dendik

    Offline

    Dendik
    Опытный в 1С

    Регистрация:
    12 фев 2010
    Сообщения:
    55
    Симпатии:
    0
    Баллы:
    26

    Нет там такого реквезита


    Dendik,
    15 апр 2014
    #3

  4. Vladius

    Offline

    Vladius
    Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    674
    Симпатии:
    3
    Баллы:
    29

    Реквизит называется «Сделка», тут заполняется документ основание.


    Vladius,
    15 апр 2014
    #4
  5. TopicStarter Overlay

    Dendik

    Offline

    Dendik
    Опытный в 1С

    Регистрация:
    12 фев 2010
    Сообщения:
    55
    Симпатии:
    0
    Баллы:
    26

    Ок, спасибо!


    Dendik,
    15 апр 2014
    #5

  6. Tiger86

    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104

    видимо где как называется


    Tiger86,
    17 апр 2014
    #6
(Вы должны войти или зарегистрироваться, чтобы ответить.)
Показать игнорируемое содержимое
Похожие темы

  1. Dmitrij

    7.7
    Документ основание

    Dmitrij,
    12 сен 2008
    , в разделе: Отчеты и обработки для «1С:Предприятие 7.7»
    Ответов:
    1
    Просмотров:
    2.110
    Kaboom
    12 сен 2008

  2. XXL

    8.х
    Документ-основание/подчиненный документ

    XXL,
    27 авг 2009
    , в разделе: Конфигурирование на платформе «1С:Предприятие 8»
    Ответов:
    5
    Просмотров:
    7.248
    Mokey
    11 сен 2009

  3. BigAnn

    7.7
    Документ основание

    BigAnn,
    16 сен 2009
    , в разделе: Отчеты и обработки для «1С:Предприятие 7.7»
    Ответов:
    4
    Просмотров:
    1.777
    Бухгалтерский угодник
    17 сен 2009

Загрузка…
Ваше имя или e-mail:
У Вас уже есть учётная запись?
  • Нет, зарегистрироваться сейчас.
  • Да, мой пароль:
  • Забыли пароль?

Запомнить меня


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Поиск

  • Искать только в заголовках
Сообщения пользователя:

Имена участников (разделяйте запятой).

Новее чем:
  • Искать только в этой теме
  • Искать только в этом разделе
    • Отображать результаты в виде тем

Быстрый поиск

  • Последние сообщения

Больше…

Как выбрать и упорядочить документы за период в 1С

&НаСервере
Процедура КакВыбратьИУпорядочитьДокументыЗаПериодНаСервере()

// найдём все документы поступления за 2020 год
// упорядочив их по возрастанию даты

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка
|ИЗ
| Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
|ГДЕ
| Дата МЕЖДУ &НачДата И &КонДата
|УПОРЯДОЧИТЬ ПО
| Дата ВОЗР";

Запрос.УстановитьПараметр("НачДата", '20200101');
Запрос.УстановитьПараметр("КонДата", '20201231');

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

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

Пока ВыборкаДокументов.Следующий() Цикл
  Сообщить(ВыборкаДокументов.Ссылка);
КонецЦикла;

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

Как найти документ по номеру в 1С

&НаСервере
Процедура КакНайтиДокументПоНомеруНаСервере()

// найдём поступление № А-000000001 за 2020 год

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка
|ИЗ
| Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
|ГДЕ
| Дата МЕЖДУ &НачДата И &КонДата И
| Номер = &ВыбНомер";

Запрос.УстановитьПараметр("НачДата", '20200101');
Запрос.УстановитьПараметр("КонДата", '20201231');
Запрос.УстановитьПараметр("ВыбНомер", "А-000000001");

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

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

Если ВыборкаДокументов.Следующий() Тогда
Сообщить(ВыборкаДокументов.Ссылка);
Иначе
Сообщить("Документ с таким номером не существует!");
КонецЕсли;

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

Как найти документы по реквизиту в 1С

&НаСервере
Процедура КакНайтиДокументПоРеквизитуНаСервере()

// найдём все документы поступления
// от поставщика ООО "Ромашка"

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка,
| Поставщик
|ИЗ
| Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
|ГДЕ
| Поставщик = &ВыбПоставщик
|УПОРЯДОЧИТЬ ПО
| Дата ВОЗР";

Запрос.УстановитьПараметр(
"ВыбПоставщик",
Справочники.Поставщики.НайтиПоНаименованию("ООО ""Ромашка""")
);

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

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

Пока ВыборкаДокументов.Следующий() Цикл
Сообщить(
Строка(ВыборкаДокументов.Ссылка) + " " +
ВыборкаДокументов.Поставщик
);
КонецЦикла;

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

Как выбрать все документы, которые не проведены и не помечены на удаление в 1С

&НаСервере
Процедура КакВыбратьВсеДокументыКоторыеНеПроведеныИНеПомеченыНаУдалениеНаСервере()

// найдём не проведенные и не помеченные на удаление
// документы поступления товаров

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

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

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

Пока ВыборкаДокументов.Следующий() Цикл
Сообщить(
Строка(ВыборкаДокументов.Ссылка) + " " +
ВыборкаДокументов.Проведен + " " +
ВыборкаДокументов.ПометкаУдаления
);
КонецЦикла;

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

Как найти подчиненные документы в 1С

&НаСервере
Процедура КакНайтиПодчиненныеДокументыНаСервере()

// Рассмотрим работу с подчиненными (связанными) документами
// на примере документов: ПоступлениеТоваровУслуг и СчетФактураПолученный.

// Документ СчетФактураПолученный вводится на основании документа
// ПоступлениеТоваровУслуг, то есть счет фактура является подчиненной
// по отношению к поступлению.

// Факт подчиненности обычно (в типовых) фиксируется в самом подчиненном
// документе через табличную часть ДокументыОснования.
// Почему через табличную часть? Потому что один документ может зависеть
// (быть подчиненным) сразу от нескольких родителей (оснований).

// Пример №1.
// У нас есть ссылка на поступление товаров и услуг. Требуется найти
// счёт-фактуры, которые были введены на основании этого поступления.
// В дереве подчиненности эти фактуры будут подчинены (зависимы) от
// документа поступления.

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка
|ИЗ
| Документ.СчетФактураПолученный.ДокументыОснования КАК
| СчетФактураПолученныйДокументыОснования
|ГДЕ
| СчетФактураПолученныйДокументыОснования.ДокументОснование =
| &ВыбПоступление";

Запрос.УстановитьПараметр("ВыбПоступление",
Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру("А-00000005", '20200101')
);

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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ПодчиненнаяФактура = ВыборкаДетальныеЗаписи.Ссылка;
Сообщить(ПодчиненнаяФактура);
КонецЦикла;

// Пример №2.
// У нас есть ссылка на счет-фактуру полученную. Требуется найти,
// документы, на основании которых она была введена (родителей).

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокументОснование
|ИЗ
| Документ.СчетФактураПолученный.ДокументыОснования КАК
| СчетФактураПолученныйДокументыОснования
|ГДЕ
| СчетФактураПолученныйДокументыОснования.Ссылка =
| &ВыбСчетФактура";

Запрос.УстановитьПараметр("ВыбСчетФактура",
Документы.СчетФактураПолученный.НайтиПоНомеру("А-00000002", '20200101')
);

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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
  РодительФактуры = ВыборкаДетальныеЗаписи.ДокументОснование;
  Сообщить(РодительФактуры);
КонецЦикла;

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

Как перебрать (перечислить) строки табличной части документа в 1С

&НаСервере
Процедура КакПеречислитьСтрокиИзТабличнойЧастиДокументаНаСервере()

// У документа Поступление есть табличная часть 'Товары'.
// У этой табличной части есть колонки: Номенклатура, Количество,
// Сумма.

ПоступлениеСсылка =
Документы.ПоступлениеТоваров.НайтиПоНомеру(
"А-00000001", '20201231');

// перечислим строки табличной части этого документа

// при помощи объектной техники

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

// при помощи запроса

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеТоваровТовары.Номенклатура,
| ПоступлениеТоваровТовары.Количество,
| ПоступлениеТоваровТовары.Сумма
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
|ГДЕ
| ПоступлениеТоваровТовары.Ссылка = &ВыбПоступление";

Запрос.УстановитьПараметр("ВыбПоступление", ПоступлениеСсылка);

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

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

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

Сообщить(
ВыборкаДетальныеЗаписи.Номенклатура.Наименование + " " +
ВыборкаДетальныеЗаписи.Количество + " шт. " +
ВыборкаДетальныеЗаписи.Сумма + " руб."
);

КонецЦикла;

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

Как создать документ в 1С

// создадим новый документ поступление
Поступление = Документы.ПоступлениеТоваров.СоздатьДокумент();
// заполним шапку документа
Поступление.Дата = ТекущаяДата();
Поступление.Поставщик =
Справочники.Поставщики.НайтиПоНаименованию(
"ООО ""Ромашка"""
);
Поступление.Склад =
Справочники.Склады.НайтиПоНаименованию(
"Основной склад"
);
// заполним табличную часть
НоваяСтрока = Поступление.Товары.Добавить();
НоваяСтрока.Номенклатура =
Справочники.Номенклатура.НайтиПоНаименованию(
"Сапоги"
);
НоваяСтрока.Количество = 2;
НоваяСтрока.Сумма = 3000;

 Как записать документ в 1С

Поступление.Записать(РежимЗаписиДокумента.Запись);

Как провести документ в 1С

Поступление.Записать(РежимЗаписиДокумента.Проведение);

 Как отменить проведение документа в 1С

Поступление.Записать(РежимЗаписиДокумента.ОтменаПроведения);

Как внести изменения в документ по ссылке в 1С

// зачастую у нас есть только ссылка на документ
// и чтобы по ней получить сам объект документа
// для изменения нужно вызывать метод ПолучитьОбъект

// найдём документ под номером А-000000001
// для лаконичности примера воспользуемся не запросом,
// а объектной техникой

СсылкаДокумент = Документы.РеализацияТоваров.НайтиПоНомеру(
"А-000000001",
'20201231' // поиск среди документов 2020 года
);
// нам вернули не сам документ, а ссылку (указатель) на него

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

Как получить пустую ссылку типа документ в 1С

ДокументСсылкаПустая = Документы.РеализацияТоваров.ПустаяСсылка();
Если ДокументСсылкаПустая.Пустая() Тогда
 Сообщить("Ссылка действительно пустая.");
КонецЕсли;

Как скопировать существующий документ в 1С

// скопируем документ и запишем
// как новый документ от сегодняшнего числа

КопияДокументаОбъект = КакойтоДокументСсылка.Скопировать();
КопияДокументаОбъект.Дата = ТекущаяДата();
КопияДокументаОбъект.Комментарий = "Копия документа " + Строка(КакойтоДокументСсылка);
// запишем и проведём документ
КопияДокументаОбъект.Записать(РежимЗаписиДокумента.Проведение);

 Как заблокировать документ перед изменениями в 1С

// выполним блокировку документа
// от изменения другими режимами или пользователями

ДокументОбъект = СсылкаДокумент.ПолучитьОбъект();
Если Не ДокументОбъект .Заблокирован() Тогда
 ДокументОбъект .Заблокировать();
 // тут идёт какой-то долгий алгоритм
 // в результате которого мы меняем
 // заблокированный элемент
 ...
 ДокументОбъект.Записать();
 // и только потом освобождаем его
 // для других режимов и пользователей
 ДокументОбъект.Разблокировать();
КонецЕсли;

Как создать новый документ на основании другого объекта в 1С

// создадим документ на основании поступления и заполним

// замечание: в модуле объекта документа РеализацияТоваров дополнительно надо создать обработчик ОбработкаЗаполнения(), в который надо вписать код заполнения табличной части

НоваяРеализацияОбъект = Документы.РеализацияТоваров.СоздатьДокумент();
НоваяРеализацияОбъект.Дата = ТекущаяДата();
НоваяРеализацияОбъект.Комментарий = "Документ введён на основании " + Строка(ДокументСсылкаПоступление1);
НоваяРеализацияОбъект.Заполнить(ДокументСсылкаПоступление1); //тут будет вызвана "ОбработкаЗаполнения" 
НоваяРеализацияОбъект.Записать(РежимЗаписиДокумента.Проведение);

Как пометить на удаление документ в 1С

ДокументОбъект.УстановитьПометкуУдаления(Истина);
// метод Записать вызывать не нужно

Как найти и изменить программно движения документа в 1С

&НаСервере
Процедура КакНайтиИИзменитьДвиженияДокументаНаСервере()

// предположим у нас есть ссылка на проведенный
// документ поступления № А-000000001

ПоступлениеСсылка = Документы.ПоступлениеТоваров.НайтиПоНомеру("А-000000001", '20201231');

// мы знаем, что этот документ делает записи по регистру накопления "ТоварыНаСкладах"

// изменим записи по регистру "ТоварыНаСкладах"

ПоступлениеОбъект = ПоступлениеСсылка.ПолучитьОбъект();

// получим набор записей этого документа в регистр ТоварыНаСкладах
НаборЗаписей = ПоступлениеОбъект.Движения.ТоварыНаСкладах;

// прочитаем записи из базы данных
НаборЗаписей.Прочитать();

Для Каждого Запись Из НаборЗаписей Цикл

// выведем старые значения
Сообщить(
Строка(Запись.ВидДвижения) + " " +
Запись.Номенклатура + " " + Запись.Количество
);

// изменим запись, удвоив количество
Запись.Количество = Запись.Количество * 2;

КонецЦикла;

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

//запишем набор записей
НаборЗаписей.Записать(Истина); // удалим старые движения и запишем вместо них новые

//внимание! после стандартной перезаписи документа наши изменения вновь будут перезаписаны типовым алгоритмом (если он есть в модуле объекта).

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

Как прочитать движения документа по регистрам запросом в 1С

&НаСервере
Процедура КакПрочитатьДвиженияДокументаЗапросомНаСервере()

// этот приём используется, если не требуется изменять
// найденные записи

// предположим у нас есть ссылка на проведенный
// документ поступления товаров № А-0000000001

ПоступлениеСсылка =
Документы.ПоступлениеТоваров.НайтиПоНомеру(
"А-0000000001", '20201231');

// прочитаем записи по регистру "ТоварыНаСкладах" запросом

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

Запрос.УстановитьПараметр("ВыбРегистратор", ПоступлениеСсылка);

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

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

Пока Выборка .Следующий() Цикл
Сообщить(
"#" + Выборка.НомерСтроки +
" " + Выборка.ВидДвижения +
" " + Выборка.Номенклатура+
" " + Выборка.Количество
);
КонецЦикла;

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

Как изменить проведенный документ, не меняя его в 1С

&НаСервере
Процедура КакИзменитьПроведенныйДокументНеМеняяЕгоДвиженийНаСервере()

// бывает так, что есть проведенный документ
// в уже закрытом периоде и нужно изменить
// некоторое поле документа, но так чтобы
// не поменялись проводки документа

ПоступлениеСсылка =
Документы.ПоступлениеТоваров.НайтиПоНомеру(
"А-0000000001", '20201231');

// Изменим количество в табличной части этого документа
// на 1, но чтобы проводки (движения) остались прежними

Поступление = ПоступлениеСсылка.ПолучитьОбъект();

Для Каждого Строка Из Поступление.Товары Цикл
 Строка.Количество = 1;
КонецЦикла;

// если сейчас просто записать документ
// изменятся его проводки, ведь он уже проведён

// но если установить флаг Загрузка
Поступление.ОбменДанными.Загрузка = Истина;

// то можно записать проведенный документ
// без повторного проведения

Поступление.Записать();

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

Как найти документ по номеру в 1С

&НаСервереБезКонтекста
Функция ПолучитьДокументПоНомеру(Номер, ДатаИнтервала)

 Возврат Документы.РеализацияТоваров.НайтиПоНомеру(Номер, ДатаИнтервала);

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

Как открыть форму существующего документа в 1С

&НаКлиенте
Процедура КакОткрытьФормуСуществующегоДокумента(Команда)

СсылкаНаДокумент = Документы.РеализацияТоваров.НайтиПоНомеру("А-000000002", '20201231');

ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);

ОткрытьФорму(
"Документ.РеализацияТоваров.ФормаОбъекта", // имя формы
ПараметрыФормы // параметры для формы
);

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

Как открыть форму выбора документа и отследить её закрытие в 1С

&НаКлиенте
Процедура КакОткрытьФормуВыбораДокумента(Команда)

ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораДокумента",
ЭтотОбъект);

ОткрытьФорму(
"Документ.РеализацияТоваров.ФормаВыбора",,,,,,ОповещениеОЗакрытии
);

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

&НаКлиенте
Процедура ПослеВыбораДокумента(Результат, Параметры) Экспорт

Если Результат <> Неопределено Тогда
Сообщить("Был выбран документ " + Результат);
КонецЕсли;

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

Как открыть форму списка (журнал) документов с отбором по реквизиту в 1С

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

// откроем список поступлений, оставив
// только те, что от поставщика ООО "Ромашка"

ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Поставщик",
НайтиПоставщикаПоИмени("ООО ""Ромашка"""));

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);

ОткрытьФорму(
"Документ.ПоступлениеТоваров.ФормаСписка",
ПараметрыФормы
);

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

Как открыть форму только что созданного, но ещё не записанного документа в 1С

&НаКлиенте
Процедура КакОткрытьФормуНовогоНеЗаписанногоДокумента(Команда)

// получаем форму нового документа
ФормаНовогоДокумента = ПолучитьФорму(
"Документ.ПоступлениеТоваров.ФормаОбъекта",,, Истина);

// делаем копию её данных (так как напрямую их менять
// нельзя)
КопияДанныхФормы = ФормаНовогоДокумента.Объект;

// заполняем эти данные на сервере
ЗаполнитьДанныеФормыНаСервере(КопияДанныхФормы);

// копируем заполненные данные в исходную форму
КопироватьДанныеФормы(КопияДанныхФормы,
ФормаНовогоДокумента.Объект);

// показываем форму нового заполненного
// документа пользователю
ФормаНовогоДокумента.Открыть();

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

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

// преобразуем данные формы в документ
Поступление = ДанныеФормыВЗначение(ДанныеФормы,
Тип("ДокументОбъект.ПоступлениеТоваров"));

// заполним только табличную часть
НоваяСтрока = Поступление.Товары.Добавить();
НоваяСтрока.Номенклатура =
Справочники.Номенклатура.НайтиПоНаименованию(
"Сапоги"
);
НоваяСтрока.Количество = 2;
НоваяСтрока.Сумма = 3000;

// преобразуем документа обратно в данные формы
ЗначениеВДанныеФормы(Поступление, ДанныеФормы);

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

You have no rights to post comments

Как быстро програмно найти документ созданный на основании

Я
   picom

30.05.13 — 15:51

Допустим имеем документ А, на его основании был создан документ Б

В документе Б есть запись в реквизите Основание



Нужно в Документе А вывести строку о том что уже есть введенный документ на основании Б.



Вопрос, как корректно программно максимально быстро найти документ Б?



Варианты которые я знаю:

1. Перебирать запросом таблицу документа Б с параметром Документ А

2. Через Критерий отбора можно, с параметром Документ А

Как еще?

Причем для варианта 2 наверное надо реквизит сделать индексируемым…

   ДенисЧ

1 — 30.05.13 — 15:52

в типовой торговле смотри глНайтиСчетФактуру

   Frost616

2 — 30.05.13 — 15:53

(0) а почему перебирать таблицу?

   Mitriy

3 — 30.05.13 — 15:54

запросом

   picom

4 — 30.05.13 — 15:56

(1) а как там? скажите в двух словах, нет 1с щас под рукой

   ДенисЧ

5 — 30.05.13 — 15:58

Функция НайтиПодчиненныйСчетФактуру(Знач ДокументСсылка, ВидДокумента = «СчетФактураВыданный», Отбор = Неопределено, ИсключитьИзВыборкиСФ = Неопределено, МетаданныеОснования = Неопределено) Экспорт

   Если не ЗначениеЗаполнено(ДокументСсылка) Тогда

       Возврат Неопределено;

   Иначе

       
       Если МетаданныеОснования = Неопределено Тогда

           МетаданныеОснования = ДокументСсылка.Метаданные();

       КонецЕсли;

       
       Если МетаданныеОснования.Реквизиты.Найти(«ИспользоватьДокументРасчетовКакСчетФактуру») <> Неопределено

           И МетаданныеОснования.Реквизиты.Найти(«РасчетныйДокумент») <> Неопределено

           И ДокументСсылка.ИспользоватьДокументРасчетовКакСчетФактуру Тогда

           Если Не ЗначениеЗаполнено(ДокументСсылка.РасчетныйДокумент) Тогда

               Возврат Неопределено;

           Иначе

               Если ТипЗнч(ДокументСсылка.РасчетныйДокумент) = Тип(«ДокументСсылка.ВозвратТоваровОтПокупателя»)

                   И Не ДокументСсылка.РасчетныйДокумент.ПокупателемВыставляетсяСчетФактураНаВозврат Тогда

                   ДокументСсылка = ДокументСсылка.РасчетныйДокумент.Сделка;

                   Если Не ЗначениеЗаполнено(ДокументСсылка) Тогда

                       Возврат Неопределено;

                   КонецЕсли;

                   МетаданныеОснования = ДокументСсылка.Метаданные();                    

               Иначе

                   ДокументСсылка = ДокументСсылка.РасчетныйДокумент;

                   МетаданныеОснования = ДокументСсылка.Метаданные();

               КонецЕсли;

           КонецЕсли;

       КонецЕсли;

       Если ВидДокумента = «СчетФактураПолученный»

           И МетаданныеОснования.Реквизиты.Найти(«ПредъявленСчетФактура») <> Неопределено

           И ДокументСсылка.ПредъявленСчетФактура

           И Не ?(ТипЗнч(ИсключитьИзВыборкиСФ) = Тип(«Массив»), ИсключитьИзВыборкиСФ.Найти(ДокументСсылка) <> Неопределено, ДокументСсылка = ИсключитьИзВыборкиСФ) Тогда

           Возврат ДокументСсылка;

       КонецЕсли;

       
   КонецЕсли;

   
   НайденныйДокумент = Неопределено;

   Запрос = Новый Запрос;

   // Установим параметры запроса

   Запрос.УстановитьПараметр(«ДокументСсылка», ДокументСсылка);

   Запрос.Текст =

   «ВЫБРАТЬ РАЗРЕШЕННЫЕ

   |    СФ.Ссылка

   |ПОМЕСТИТЬ ВрмТбл

   |ИЗ

   |    Документ.СчетФактураВыданный.ДокументыОснования КАК СФ

   |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураВыданный.Авансы КАК Авансы

   |        ПО СФ.Ссылка = Авансы.Ссылка

   |ГДЕ

   |    СФ.ДокументОснование = &ДокументСсылка»;

   
   Если не ВидДокумента = «СчетФактураВыданный» Тогда

       Запрос.Текст = СтрЗаменитЬ(Запрос.Текст,»СчетФактураВыданный»,ВидДокумента);

   КонецЕсли;

   
   Если ЗначениеЗаполнено(ИсключитьИзВыборкиСФ) Тогда

       Запрос.УстановитьПараметр(«ИсключитьИзВыборкиСФ», ИсключитьИзВыборкиСФ);

       Если ТипЗнч(ИсключитьИзВыборкиСФ) = Тип(«Массив») Тогда

           Запрос.Текст = Запрос.Текст + »

               |    И НЕ СФ.Ссылка В (&ИсключитьИзВыборкиСФ)

               |»;

       Иначе

           Запрос.Текст = Запрос.Текст + »

               |    И НЕ СФ.Ссылка = &ИсключитьИзВыборкиСФ

               |»;

       КонецЕсли;

   КонецЕсли;

   Если не Отбор = Неопределено Тогда

       Для каждого ЭлементОтбора Из Отбор Цикл

           Если ТипЗнч(ЭлементОтбора.Значение) = Тип(«Булево») Тогда

           
               Запрос.Текст = Запрос.Текст + »

                   |    И «+?(ЭлементОтбора.Значение,» «,» НЕ «)+» СФ.Ссылка.»+ЭлементОтбора.Ключ;

           ИначеЕсли ЭлементОтбора.Ключ = «СтавкиНДС» Тогда

           
               Запрос.УстановитьПараметр(ЭлементОтбора.Ключ, ЭлементОтбора.Значение);

               Запрос.Текст = Запрос.Текст + »

                   |    И Авансы.СтавкаНДС В (&»+ЭлементОтбора.Ключ+»)»;

           ИначеЕсли ЭлементОтбора.Ключ = «СчетНаОплату»

                       И ВидДокумента = «СчетФактураВыданный» Тогда

           
               Запрос.УстановитьПараметр(ЭлементОтбора.Ключ, ЭлементОтбора.Значение);

               Запрос.Текст = Запрос.Текст + »

                   |    И Авансы.СчетНаОплату В (&»+ЭлементОтбора.Ключ+»)»;

           Иначе

               
               Запрос.УстановитьПараметр(ЭлементОтбора.Ключ, ЭлементОтбора.Значение);

               Запрос.Текст = Запрос.Текст + »

                   |    И СФ.Ссылка.»+ЭлементОтбора.Ключ+» = &»+ЭлементОтбора.Ключ;

           КонецЕсли;

       КонецЦикла;

   КонецЕсли;

   
   Запрос.Текст = Запрос.Текст + «;»;

   
   Запрос.Текст = Запрос.Текст + »

   |ВЫБРАТЬ Ссылка

   | ИЗ ВрмТбл

   |УПОРЯДОЧИТЬ ПО

   |    Ссылка.ПометкаУдаления,

   |    Ссылка.Проведен УБЫВ,

   |    Ссылка.Дата»;

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

   Если ВыборкаИзЗапроса.Следующий() Тогда

       НайденныйДокумент = ВыборкаИзЗапроса.Ссылка;

   КонецЕсли;

   Возврат НайденныйДокумент;

КонецФункции // НайтиПодчиненныйСчетФактуру()

   picom

6 — 30.05.13 — 16:02

(5)

Т.е. перебор запросом документов Б по реквизиту Основание ?

   picom

7 — 03.06.13 — 10:34

Все правильно в (6) ?

   Defender aka LINN

8 — 03.06.13 — 10:38

(6) Не надо изобретать туманных понятий и пытаться их нам навязывать. «Перебор запросом» — это все равно, что «качение машиной»

   picom

9 — 03.06.13 — 10:40

(8) Согласен, выразился не корректно. Получается что запросом по таблице с документами найти подчиненный документ быстрее, верно?

  

Defender aka LINN

10 — 03.06.13 — 10:45

(9) Любое чтение данных из базы — это запрос.

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Акт прогула работника как составить
  • Как найти внутреннюю память на айфоне
  • Как найти осмотическое давление сахарозы
  • Как можно исправить нос у косметолога
  • Как найти эндер крепость без око эндера

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии