как в запросе отбирать по значению доп реквизита? |
Я |
27.12.21 — 15:16
Здравствуйте, подскажите пожалуйста запросом достаю данные по продажам и РН, у соглашений есть доп реквизит тип соглашения,
и мне нужно найти все документы по значению доп реквизита
1 — 27.12.21 — 15:18
Соединение по таблице ДополнительныеРеквизиты, а таблица соединяется с самим документом по полю Ссылка.
2 — 27.12.21 — 15:23
(1)
ВЫБРАТЬ
ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот КАК СуммаВыручкиОборот
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(, , , Договор.Партнер.БизнесРегион = &БизнесРегион) КАК ВыручкаИСебестоимостьПродажОбороты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СоглашенияСКлиентами.ДополнительныеРеквизиты КАК СоглашенияСКлиентамиДополнительныеРеквизиты
ПО (СоглашенияСКлиентамиДополнительныеРеквизиты.Ссылка = &Ссылка)
3 — 27.12.21 — 15:25
(1) а что мне в ссылку передавать? значение доп рекв?
4 — 27.12.21 — 15:26
Для начала было бы неплохо понимать с чем ты имеешь дело. Доп реквизиты — это табличная часть справочника СоглашенияСКлиентами.
Если у тебя задача как ты описал, то сперва будет правильным выбрать во временную таблицу все нужные соглашения, у которых есть этот доп реквизит, затем внутренним соединением привязать к твоему запросу к ВыручкаИСебестоимостьПродаж.
Если же ты хочешь в результат запроса выводить все типы соглашений, а уже параметрами или отборами в СКД выбирать нужные, то присоединяй левым соединением таблицу с доп реквизитами по условию Свойство = &ТвоёСвойство, которое и будет твоё ПВХ ТипСоглашения
Как работать с доп реквизитами и что такое ПланыВидовХарактеристик сам гугли)
5 — 27.12.21 — 15:32
(4) нужно получиться суммувыручки по тем документам по которым тип соглашение «N», как я понял это первый вариант который вы описали да?
6 — 27.12.21 — 15:36
Да. Если тебе не скажут через час «а теперь дай нам такой же отчёт по всем соглашениям, и сгруппируй по типам соглашениям и по менеджерам».
7 — 27.12.21 — 15:39
(6) спасибо буду разбираться
8 — 27.12.21 — 16:17
(2)
А где в запросе связь между таблицами ?
ВыручкаИСебестоимостьПродажОбороты
СоглашенияСКлиентамиДополнительныеРеквизиты
9 — 27.12.21 — 16:20
(8) ВЫБРАТЬ
ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот КАК СуммаВыручкиОборот
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(
&НачалоПериода,
&КонецПериода,
,
Договор.Партнер.БизнесРегион = &БизнесРегион
И Соглашение.ДополнительныеРеквизиты.Значение = &Значение) КАК ВыручкаИСебестоимостьПродажОбороты
ШурикОвёрт
10 — 27.12.21 — 16:21
(8) сделал таким макаром вроде как выдаёт всё что нужно
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 47
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
Быстрый отбор в справочнике по первой букве 0
В статье описан способ быстрой организации отбора в списке справочника по первой букве наименования. Механизм легко дотачивается под собственные нужды.
https://helpf.pro/uploads/img/_1-T4ZDj6uNPX.png
// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ
НаКлиенте
Ввод записей в журнал расчетов 1
Добавление записи в журнал расчетов:
Метод Новая может быть вызван где угодно, в глобальном модуле, модуле обработок, документов и т.д.
Данный метод проверяет корректность заполненных реквизитов журнала расчетов. При вводе новых записей журнал
Восстановление узла распределенной информационной базы из резервной копии 0
В случае возникновения ситуации, при которой необходимо восстановить резервную копию информационной базы, работающую в рамках распределенной информационной базы, можно воспользоваться следующими рекомендациями.
Процедура восстановления информационно
Выборка (перебор) бизнес-процессов 0
Выбрать( , , , )
отбора
отбора
(необязательный) — Структура. Задает реквизит вида расчета и значение этого реквизита, по которому будет создана выборка. Ключ структуры задает имя реквизита, а значение структуры — значение отбора по этому рекви
Посмотреть все результаты поиска похожих
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 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; // преобразуем документа обратно в данные формы ЗначениеВДанныеФормы(Поступление, ДанныеФормы); КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере
Опубликовано ср, 18/04/2012 — 00:07 пользователем guru
1. Создаём Критерий отбора.
2. Выбираем тип данных, по которому будет производиться отбор в списке документов.
3. Выбираем справочники и документы, в которых будет применяться отбор.
4. Создаём новую форму списка копированием.
5. Добавляем реквизит формы с типом данных как и в критерии отбора.
6. Добавляем на форму поле ввода. (Данные – реквизит формы, созданный в п.5. Выбор групп и элементов – Элементы.)
7. Создаём обработчик события ПриИзменении.
//Отбор по номенклатуре
Процедура НоменклатураПриИзменении(Элемент)
Если ЗначениеЗаполнено(Номенклатура) Тогда
Отбор.ОтборПоНоменклатуре.Установить(Номенклатура);
Иначе
Отбор.ОтборПоНоменклатуре.Использование = Ложь;
КонецЕсли;
КонецПроцедуры
8. Устанавливаем созданную форму в качестве основной формы списка.
© При копировании материалов сайта ссылка на оригинал обязательна.
как выбрать документы по значению реквизита? ВыбратьДокументыПоЗначению не работает
Объект — документ определенного вида. не работает
док.ВыбратьПоЗначению(,,»ВШаблон»,»1″); теперь ошибка: Неверное имя реквизита
Либо регистр без ресурсов (лучше всего), либо графу отбора.
во первых, реквизит должен быть общим с признаком отбора, либо графа отбора. во вторых, для документа одного вида. У меня когда то работало примено вот так: Пока д.ПолучитьДокумент = 1 и т.д.
тоже самое: неверное имя реквизита . «ВШаблон» — графа отбора журнала
Как вариант: Заведи графу отбора, использующуюся только для нужного вида документов. И юзай док=создатьобъект(«Документ»);
дак она и есть только для опр вида документов.. ничего не понимаю
А нах тогда : «Объект — документ определенного вида»?
это была первая ошибка, уже исправлена, а теперь вторая: Неверное имя реквизита
Вот тебе кусок рабочего кода:
Может быть конструкция Док.ВыбратьДокументы; Пока Док.ПолучитьДокумент=1 Цикл Если СокрЛП(Док.МойРеквизит)<>»Нужное значение» Тогда продолжить;КонецЕсли; ,,,,, работает на пару процентов медленнее, но вернее
#15
by При хорошем количест
Документов конструкция работает на пару порядков дольше. Чем отбор по реквизиту.
не на пару процентов, а на пару порядков
конструкция конечно хорошая с точки зрения безотказности, но вот скорости.. и все-таки интересно, почему может быть ошибка «Неверное имя реквизита»
Потому что написал ты его неправильно. Раскладку проверь чтоли… Ну не может быть чтоб не работало.
А запросом по документам не пробовал?
нет, я с запросами не очень-то еще разбираюсь
ладно, пусть работает как в 14
«нельзя» и «не знаю как» это разные вещи.
а кто говорил нельзя? был вопрос:А запросом по документам не пробовал? ответ: нет (то есть не пробовал)
Тэги:
Комментарии доступны только авторизированным пользователям
ДокументыМенеджер
Объект ДокументыМенеджер позволяет получить доступ ко всем менеджерам документов. Это можно сделать перебрав все менеджеры в цикле или обратившись к конкретному менеджеру по имени. Также данный объект позволяет проверить является ли ссылка ссылкой на какой-нибудь документ:
//получение конкретного менеджера документа по имени МенеджерДокаПриход = Документы.ПриходТовара; МенеджерДокаРасход = Документы["РасходТовара"]; //перебор всех менеджеров документа Для Каждого МенеджерДока Из Документы Цикл Сообщить(МенеджерДока); КонецЦикла; СсылкаНаЧтото = ПолучитьСсылкуНаЧтото(); //проверка является ли ссылка ссылкой на документ ВсеДоки = Документы.ТипВсеСсылки(); Если ВсеДоки.СодержитТип(ТипЗнч(СсылкаНаЧтото)) Тогда //это ссылка на документ Иначе //что-то другое КонецЕсли;
Создание документа программно
Чтобы программно создать документ нужно использовать метод менеджера документа СоздатьДокумент:
//создаем новый документ ПриходныйДок = Документы.ПриходТовара.СоздатьДокумент(); //обязательно заполняем дату ПриходныйДок.Дата = ТекущаяДатаСеанса(); //... заполняем другие реквизиты ПриходныйДок.Поставщик = СсылкаНаПоставщика; //записываем в базу данных ПриходныйДок.Записать();
Программное заполнение документа
Для программного заполнения документа нужно обращаться к каждому реквизиту объекта по имени, через точку от объекта:
//создаем новый документ ПриходныйДок = Документы.ПриходТовара.СоздатьДокумент(); //обязательно заполняем дату ПриходныйДок.Дата = ТекущаяДатаСеанса(); //заполняем реквизиты Поставщик, Склад, Комментарий ПриходныйДок.Поставщик = СсылкаНаПоставщика; ПриходныйДок.Склад = СсылкаНаСклад; ПриходныйДок.Комментарий = "документ создан программно"; //записываем в базу данных ПриходныйДок.Записать();
Программное заполнение табличной части документа
К табличной части документа можно обратиться по имени, через точку от объекта. Затем через метод Добавить добавить новую строку табличной части. К реквизитам строки можно обращаться по имени, через точку от строки. В целом работа с табличной частью документа похожа на работу с таблицей значений:
//создаем новый документ ПриходныйДок = Документы.ПриходТовара.СоздатьДокумент(); //добавим несколько строк в табличную часть СписокТоваров НоваяСтрТЧ = ПриходныйДок.СписокТоваров.Добавить(); НоваяСтрТЧ.Товар = СсылкаНаТоварОдин; НоваяСтрТЧ.Количество = 18; НоваяСтрТЧ = ПриходныйДок.СписокТоваров.Добавить(); НоваяСтрТЧ.Товар = СсылкаНаТоварДва; НоваяСтрТЧ.Количество = 36; //можно загрузить строки из таблицы значений //имена колонок должны совпадать с именами реквизитов табличной части ПриходныйДок.СписокТоваров.Загрузить(НекаяТаблица); //записываем в базу данных ПриходныйДок.Записать();
Программное изменение документа
Изменить документ можно только через программный объект. Для этого методом ПолучитьОбъект нужно получить из ссылки объект и потом изменить его реквизиты:
//получаем объект из ссылки ПриходныйДок = СсылкаНаДок.ПолучитьОбъект(); //меняем поставщика ПриходныйДок.Поставщик = СсылкаНаПоставщика; //записываем ПриходныйДок.Записать();
Программное копирование документа
Для создания копии объекта предназначен метод Скопировать. Данный метод есть как у ссылки на документ, так и у объекта:
//копия документа через ссылку НоваяКопия = СсылкаНаДок.Скопировать(); НоваяКопия.Дата = ТекущаяДатаСеанса(); НоваяКопия.Записать(); //копия документа через объект ДокОбъект = СсылкаНаДок.ПолучитьОбъект(); НоваяКопия = ДокОбъект.Скопировать(); НоваяКопия.Дата = ТекущаяДатаСеанса(); НоваяКопия.Записать();
Программное удаление документа
Пометить на удаление документ можно с помощью метода УстановитьПометкуУдаления. Параметром нужно передать значение пометки на удаление. При установке пометки на удаление документ автоматически распроводится, если он был проведен и записывается. Также можно полностью удалить документ из базы методом Удалить:
//устанавливать пометку на удаление можно только через объект ПриходныйДок = СсылкаНаДок.ПолучитьОбъект(); //пометить на удаление ПриходныйДок.УстановитьПометкуУдаления(Истина); //снять пометку на удаление ПриходныйДок.УстановитьПометкуУдаления(Ложь); //удаление документа из базы ПриходныйДок.Удалить();
Программное проведение документа
У документа нет отдельного метода для проведения документа. Проведение — это запись документа с проведением. Для проведения документа используется метод Записать, в который параметром нужно передать режим записи документа. Всего есть три режима записи: запись, проведение, отмена проведения. Если параметр не указан, то используется запись:
ПриходныйДок = Документы.ПриходТовара.СоздатьДокумент(); ПриходныйДок.Дата = ТекущаяДатаСеанса(); //запись документа ПриходныйДок.Записать(РежимЗаписиДокумента.Запись); //тоже запись ПриходныйДок.Записать(); //проведение документа ПриходныйДок.Записать(РежимЗаписиДокумента.Проведение); //отмена проведения документа ПриходныйДок.Записать(РежимЗаписиДокумента.ОтменаПроведения);
Программная работа с движениями документа
Через свойство Движения можно обращаться к движениям проведенного документа и даже редактировать их. Рассмотрим на примере:
ДатаПоиска = ТекущаяДатаСеанса(); ПриходныйДок = Документы.ПриходТовара.НайтиПоНомеру("АА0000003", ДатаПоиска); ДокПриходОбъект = ПриходныйДок.ПолучитьОбъект(); //получаем все движения документа ДвиженияДока = ДокПриходОбъект.Движения; //перебор всех регистров, по которым выполняются движения документом Для Каждого Рег Из ДвиженияДока Цикл Сообщить(Рег); КонецЦикла; //количество регистров из коллекции движений КолвоРег = ДвиженияДока.Количество(); //поиск по имени регистра РегОстатки = ДвиженияДока.Найти("ОстаткиТоваров"); Если Не РегОстатки = Неопределено Тогда //есть такой регистр //читаем записи регистра из базы данных РегОстатки.Прочитать(); //перебирам в цикле и увеличиваем количество вдвое Для Каждого ЗаписьРег Из РегОстатки Цикл ЗаписьРег.Количество = ЗаписьРег.Количество * 2; КонецЦикла; //записываем РегОстатки.Записать(); КонецЕсли;
Программный поиск документа
Чтобы программно найти документ можно использовать методы НайтиПоНомеру и НайтиПоРеквизиту менеджера документа.
НайтиПоНомеру
В метод НайтиПоНомеру первым параметром передается номер документа, вторым дата, для определения периода, в котором нужно искать документ. Если для документа указана периодичность = В пределах года, то можно передать любую дату за этот год:
ДатаПоиска = Дата(2021,1,1); //в настройках нумерации указана Периодичность = В пределах года ПриходныйДок = Документы.ПриходТовара.НайтиПоНомеру("000000017", ДатаПоиска); //поиск будет выполняться среди документов за 2021 год с номером 000000017 //в настройках нумерации указана Периодичность = В пределах месяца ПриходныйДок= Документы.ПриходТовара.НайтиПоНомеру("000000017", ДатаПоиска); //поиск будет выполняться среди документов за январь 2021 год с номером 000000017 //в настройках нумерации указана Периодичность = Непериодический //дату можно не указывать ПриходныйДок = Документы.ПриходТовара.НайтиПоНомеру("000000017"); //поиск будет выполняться среди всех документов //если документ не найден, то в ПриходныйДок будет пустая ссылка Если ПриходныйДок = Документы.ПриходТовара.ПустаяСсылка() Тогда //не нашли ИначеЕсли ПриходныйДок = Неопределено Тогда //для документа указана нулевая длина номера Иначе //ПриходныйДок - ссылка на документ КонецЕсли;
НайтиПоРеквизиту
Метод НайтиПоРеквизиту принимает два параметра: имя реквизита и значение реквизита. Если реквизит имеет тип Строка, то поиск выполняется по точному соответствию. Нельзя искать по реквизиту с типом ХранилищеЗначения или неограниченная строка.
//поиск по реквизиту //первый параметр - имя реквизита //второй параметр - значение реквизита ПриходныйДок = Документы.ПриходТовара.НайтиПоРеквизиту("Поставщик", СсылкаНаПоставщика); //если документ не найден, то в ПриходныйДок будет пустая ссылка Если ПриходныйДок = Документы.ПриходТовара.ПустаяСсылка() Тогда //не нашли Иначе //ПриходныйДок - ссылка на найденный документ //если было несколько документов с таким значением реквизита, то //будет найден первый попавшийся КонецЕсли;
Выборка документов
Чтобы получить выборку документов можно воспользоваться методом Выбрать менеджера документа. Затем полученную выборку можно перебрать с помощью цикла Пока. На каждом витке цикла будут данные об одном документе. Через параметры метода можно ограничить выборку по периоду или по реквизитам.
//выборка всех документов ВыборкаПриходов = Документы.ПриходТовара.Выбрать(); Пока ВыборкаПриходов.Следующий() Цикл //через выборку есть доступ ко всем реквизитам объекта Сообщить(ВыборкаПриходов.Номер); Сообщить(ВыборкаПриходов.Поставщик); //также через выборку можно получить объект ДокОбъект = ВыборкаПриходов.ПолучитьОбъект(); КонецЦикла; //выборка документов за 2 месяца ВыборкаПриходов = Документы.ПриходТовара.Выбрать(Дата(2021,1,1), Дата(2021,2,28)); //выборка всех документов, у которых дата больше 1 марта 2021 ВыборкаПриходов = Документы.ПриходТовара.Выбрать(Дата(2021,3,1)); //выборка всех документов, у которых дата меньше 15 марта 2021 ВыборкаПриходов = Документы.ПриходТовара.Выбрать(, Дата(2021,3,15)); //выборка документов с конкретной датой ОтборДок = Новый Структура("Дата", Дата(2021,3,22)); ВыборкаПриходов = Документы.ПриходТовара.Выбрать(,, ОтборДок); //выборка документов с конкретным значением реквизита ОтборДок = Новый Структура("Поставщик", СсылкаНаПоставщика); ВыборкаПриходов = Документы.ПриходТовара.Выбрать(,, ОтборДок); //выборка отсортированная по убыванию даты ВыборкаПриходов = Документы.ПриходТовара.Выбрать(,,, "Дата Убыв");
Выборка позволяет получать данные из базы порциями. Если в базе будет 1000000 документов, то выборка будет получить их небольшими порциями, а не загружать сразу все документы в оперативную память.
Программная работа с ссылкой на документ
Через ссылку на документ можно обратиться к реквизитам объекта. При этом будет неявно выполнен запрос к базе данных для получения значения реквизита. Так как работа с базой данных возможна только на сервере, то на клиенте нельзя от ссылки получать значения реквизитов:
Поставщик = СсылкаНаДокПриход.Поставщик; ДатаДок = СсылкаНаДокПриход.Дата; //однако на клиенте такой код не сработает с ошибкой: // поле объекта не обнаружено
Для получения пустой ссылки можно использовать метод ПустаяСсылка. Для проверки на пустую ссылку можно воспользоваться методом Пустая:
//получение пустой ссылки на документ ПустойДокПриход = Документы.ПриходТовара.ПустаяСсылка(); //проверка на пустую ссылку Если ПустойДокПриход.Пустая() Тогда //пустая ссылка КонецЕсли; //или так Если ПустойДокПриход = Документы.ПриходТовара.ПустаяСсылка() Тогда //тоже пустая ссылка КонецЕсли;
Сопоставление документов по идентификатору
У каждого документа есть уникальный идентификатор, который присваивается при первой записи документа и не может быть изменен. Часто при обмене между двумя базами данных требуется сопоставлять документы. Для этого можно использовать идентификаторы.
Пример выгрузки идентификатора документа. Уникальный идентификатор получается из ссылки методом УникальныйИдентификатор:
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(); Пока ВыборкаПриходов.Следующий() Цикл //получаем уникальный идентификатор УИДПрихода = ВыборкаПриходов.Ссылка.УникальныйИдентификатор(); //преобразуем в строку УИДПриходаСтрокой = Строка(УИДПрихода); //дальше записываем строку в файл обмена КонецЦикла;
Пример сопоставления документов по идентификатору. Здесь используется метод ПолучитьСсылку для получения ссылки на документ по уникальному идентификатору и метод УстановитьСсылкуНового чтобы уникальный идентификатор нового документа был равен уникальному идентификатору, полученному из другой базы.
//ТаблицаЗагрузки - некая таблица с данными из другой базы Для Каждого Стр ИЗ ТаблицаЗагрузки Цикл УИДПриходаСтрокой = Стр.УИД; //создаем уникальный идентификатор УИДПрихода = Новый УникальныйИдентификатор(УИДПриходаСтрокой); //получаем ссылку на документ ПриходныйДок = Документы.ПриходТовара.ПолучитьСсылку(УИДПрихода); //из ссылки получаем объект ДокПриходОбъект = ПриходныйДок.ПолучитьОбъект(); Если ДокПриходОбъект = Неопределено Тогда //если объект = Неопределено значит документа с таким //идентификатором еще нет, создаем его ДокПриходОбъект = Документы.ПриходТовара.СоздатьДокумент(); //...заполнение //до записи обязательно устанавливаем полученную ссылку //тогда идентификаторы будут совпадать ДокПриходОбъект.УстановитьСсылкуНового(ПриходныйДок); ДокПриходОбъект.Записать(); Иначе //уже есть документ с таким идентификатором, //перезаписываем его КонецЕсли; КонецЦикла;
Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра «Кто хочет стать миллионером?» с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, нидерландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки