Как Запросом выбрать данные Документа-Основания?
Автор 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
-
Offline
Dendik
Опытный в 1С- Регистрация:
- 12 фев 2010
- Сообщения:
- 55
- Симпатии:
- 0
- Баллы:
- 26
Добрый день! Помогите решить задачу. Есть документ «Реализация товаров и услуг», созданный на основании документа «Счет на оплату покупателю» Как вытащить документ-основание?
Dendik,
15 апр 2014
#1 -
Offline
Tiger86
Модераторы
Команда форума
Модератор- Регистрация:
- 24 мар 2011
- Сообщения:
- 6.407
- Симпатии:
- 108
- Баллы:
- 104
в обработке заполнения ДанныеЗаполнения вроде как, а так как реквизит хранить наверное надо
— Объединение сообщений, 15 апр 2014 —
в документе Реализация товаров и услуг посмотрите реквизит ДокументОснование
Tiger86,
15 апр 2014
#2 -
Offline
Dendik
Опытный в 1С- Регистрация:
- 12 фев 2010
- Сообщения:
- 55
- Симпатии:
- 0
- Баллы:
- 26
Нет там такого реквезита
Dendik,
15 апр 2014
#3 -
Offline
Vladius
Опытный в 1С- Регистрация:
- 10 ноя 2010
- Сообщения:
- 674
- Симпатии:
- 3
- Баллы:
- 29
Реквизит называется «Сделка», тут заполняется документ основание.
Vladius,
15 апр 2014
#4 -
Offline
Dendik
Опытный в 1С- Регистрация:
- 12 фев 2010
- Сообщения:
- 55
- Симпатии:
- 0
- Баллы:
- 26
Ок, спасибо!
Dendik,
15 апр 2014
#5 -
Offline
Tiger86
Модераторы
Команда форума
Модератор- Регистрация:
- 24 мар 2011
- Сообщения:
- 6.407
- Симпатии:
- 108
- Баллы:
- 104
видимо где как называется
Tiger86,
17 апр 2014
#6
- Похожие темы
-
7.7
Документ основание
Dmitrij,
12 сен 2008, в разделе: Отчеты и обработки для «1С:Предприятие 7.7»
- Ответов:
- 1
- Просмотров:
- 2.110
- Kaboom
- 12 сен 2008
-
8.х
Документ-основание/подчиненный документ
XXL,
27 авг 2009, в разделе: Конфигурирование на платформе «1С:Предприятие 8»
- Ответов:
- 5
- Просмотров:
- 7.248
- Mokey
- 11 сен 2009
-
7.7
Документ основание
BigAnn,
16 сен 2009, в разделе: Отчеты и обработки для «1С:Предприятие 7.7»
- Ответов:
- 4
- Просмотров:
- 1.777
- Бухгалтерский угодник
- 17 сен 2009
- Ваше имя или e-mail:
- У Вас уже есть учётная запись?
-
- Нет, зарегистрироваться сейчас.
- Да, мой пароль:
-
Забыли пароль?
-
Запомнить меня
-
- Искать только в заголовках
- Сообщения пользователя:
-
Имена участников (разделяйте запятой).
- Новее чем:
-
- Искать только в этой теме
- Искать только в этом разделе
- Отображать результаты в виде тем
-
Быстрый поиск
- Последние сообщения
Больше…
Как выбрать и упорядочить документы за период в 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
Как быстро програмно найти документ созданный на основании |
Я |
30.05.13 — 15:51
Допустим имеем документ А, на его основании был создан документ Б
В документе Б есть запись в реквизите Основание
…
Нужно в Документе А вывести строку о том что уже есть введенный документ на основании Б.
…
Вопрос, как корректно программно максимально быстро найти документ Б?
…
Варианты которые я знаю:
1. Перебирать запросом таблицу документа Б с параметром Документ А
2. Через Критерий отбора можно, с параметром Документ А
Как еще?
Причем для варианта 2 наверное надо реквизит сделать индексируемым…
1 — 30.05.13 — 15:52
в типовой торговле смотри глНайтиСчетФактуру
2 — 30.05.13 — 15:53
(0) а почему перебирать таблицу?
3 — 30.05.13 — 15:54
запросом
4 — 30.05.13 — 15:56
(1) а как там? скажите в двух словах, нет 1с щас под рукой
5 — 30.05.13 — 15:58
Функция НайтиПодчиненныйСчетФактуру(Знач ДокументСсылка, ВидДокумента = «СчетФактураВыданный», Отбор = Неопределено, ИсключитьИзВыборкиСФ = Неопределено, МетаданныеОснования = Неопределено) Экспорт
Если не ЗначениеЗаполнено(ДокументСсылка) Тогда
Возврат Неопределено;
Иначе
Если МетаданныеОснования = Неопределено Тогда
МетаданныеОснования = ДокументСсылка.Метаданные();
КонецЕсли;
Если МетаданныеОснования.Реквизиты.Найти(«ИспользоватьДокументРасчетовКакСчетФактуру») <> Неопределено
И МетаданныеОснования.Реквизиты.Найти(«РасчетныйДокумент») <> Неопределено
И ДокументСсылка.ИспользоватьДокументРасчетовКакСчетФактуру Тогда
Если Не ЗначениеЗаполнено(ДокументСсылка.РасчетныйДокумент) Тогда
Возврат Неопределено;
Иначе
Если ТипЗнч(ДокументСсылка.РасчетныйДокумент) = Тип(«ДокументСсылка.ВозвратТоваровОтПокупателя»)
И Не ДокументСсылка.РасчетныйДокумент.ПокупателемВыставляетсяСчетФактураНаВозврат Тогда
ДокументСсылка = ДокументСсылка.РасчетныйДокумент.Сделка;
Если Не ЗначениеЗаполнено(ДокументСсылка) Тогда
Возврат Неопределено;
КонецЕсли;
МетаданныеОснования = ДокументСсылка.Метаданные();
Иначе
ДокументСсылка = ДокументСсылка.РасчетныйДокумент;
МетаданныеОснования = ДокументСсылка.Метаданные();
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ВидДокумента = «СчетФактураПолученный»
И МетаданныеОснования.Реквизиты.Найти(«ПредъявленСчетФактура») <> Неопределено
И ДокументСсылка.ПредъявленСчетФактура
И Не ?(ТипЗнч(ИсключитьИзВыборкиСФ) = Тип(«Массив»), ИсключитьИзВыборкиСФ.Найти(ДокументСсылка) <> Неопределено, ДокументСсылка = ИсключитьИзВыборкиСФ) Тогда
Возврат ДокументСсылка;
КонецЕсли;
КонецЕсли;
НайденныйДокумент = Неопределено;
Запрос = Новый Запрос;
// Установим параметры запроса
Запрос.УстановитьПараметр(«ДокументСсылка», ДокументСсылка);
Запрос.Текст =
«ВЫБРАТЬ РАЗРЕШЕННЫЕ
| СФ.Ссылка
|ПОМЕСТИТЬ ВрмТбл
|ИЗ
| Документ.СчетФактураВыданный.ДокументыОснования КАК СФ
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураВыданный.Авансы КАК Авансы
| ПО СФ.Ссылка = Авансы.Ссылка
|ГДЕ
| СФ.ДокументОснование = &ДокументСсылка»;
Если не ВидДокумента = «СчетФактураВыданный» Тогда
Запрос.Текст = СтрЗаменитЬ(Запрос.Текст,»СчетФактураВыданный»,ВидДокумента);
КонецЕсли;
Если ЗначениеЗаполнено(ИсключитьИзВыборкиСФ) Тогда
Запрос.УстановитьПараметр(«ИсключитьИзВыборкиСФ», ИсключитьИзВыборкиСФ);
Если ТипЗнч(ИсключитьИзВыборкиСФ) = Тип(«Массив») Тогда
Запрос.Текст = Запрос.Текст + »
| И НЕ СФ.Ссылка В (&ИсключитьИзВыборкиСФ)
|»;
Иначе
Запрос.Текст = Запрос.Текст + »
| И НЕ СФ.Ссылка = &ИсключитьИзВыборкиСФ
|»;
КонецЕсли;
КонецЕсли;
Если не Отбор = Неопределено Тогда
Для каждого ЭлементОтбора Из Отбор Цикл
Если ТипЗнч(ЭлементОтбора.Значение) = Тип(«Булево») Тогда
Запрос.Текст = Запрос.Текст + »
| И «+?(ЭлементОтбора.Значение,» «,» НЕ «)+» СФ.Ссылка.»+ЭлементОтбора.Ключ;
ИначеЕсли ЭлементОтбора.Ключ = «СтавкиНДС» Тогда
Запрос.УстановитьПараметр(ЭлементОтбора.Ключ, ЭлементОтбора.Значение);
Запрос.Текст = Запрос.Текст + »
| И Авансы.СтавкаНДС В (&»+ЭлементОтбора.Ключ+»)»;
ИначеЕсли ЭлементОтбора.Ключ = «СчетНаОплату»
И ВидДокумента = «СчетФактураВыданный» Тогда
Запрос.УстановитьПараметр(ЭлементОтбора.Ключ, ЭлементОтбора.Значение);
Запрос.Текст = Запрос.Текст + »
| И Авансы.СчетНаОплату В (&»+ЭлементОтбора.Ключ+»)»;
Иначе
Запрос.УстановитьПараметр(ЭлементОтбора.Ключ, ЭлементОтбора.Значение);
Запрос.Текст = Запрос.Текст + »
| И СФ.Ссылка.»+ЭлементОтбора.Ключ+» = &»+ЭлементОтбора.Ключ;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Запрос.Текст = Запрос.Текст + «;»;
Запрос.Текст = Запрос.Текст + »
|ВЫБРАТЬ Ссылка
| ИЗ ВрмТбл
|УПОРЯДОЧИТЬ ПО
| Ссылка.ПометкаУдаления,
| Ссылка.Проведен УБЫВ,
| Ссылка.Дата»;
ВыборкаИзЗапроса = Запрос.Выполнить().Выбрать();
Если ВыборкаИзЗапроса.Следующий() Тогда
НайденныйДокумент = ВыборкаИзЗапроса.Ссылка;
КонецЕсли;
Возврат НайденныйДокумент;
КонецФункции // НайтиПодчиненныйСчетФактуру()
6 — 30.05.13 — 16:02
(5)
Т.е. перебор запросом документов Б по реквизиту Основание ?
7 — 03.06.13 — 10:34
Все правильно в (6) ?
8 — 03.06.13 — 10:38
(6) Не надо изобретать туманных понятий и пытаться их нам навязывать. «Перебор запросом» — это все равно, что «качение машиной»
9 — 03.06.13 — 10:40
(8) Согласен, выразился не корректно. Получается что запросом по таблице с документами найти подчиненный документ быстрее, верно?
Defender aka LINN
10 — 03.06.13 — 10:45
(9) Любое чтение данных из базы — это запрос.