Проверить наличие документа в базе.

1. 24.11.21 08:38 Сейчас в теме
Доброе утро. Делаю обход метаданных ,приходят значения документов, по которым были движения, но в некоторых документах список документов пустой. Подскажите, пожалуйста, как проверить существование документа в базе?
ОбъектыМД = Новый Массив;
ОбъектыМД.Добавить("Документы");

Для Каждого Эл Из ОбъектыМД Цикл

       Для Каждого Объект Из Метаданные[Эл] Цикл

              Если Объект.Движения.Содержит(Метаданные.РегистрыБухгалтерии.Хозрасчетный) Тогда

                        НовСтр = ТабДок.Добавить();
                        НовСтр.Документы = Строка(Объект);
          
              КонецЕсли;

        КонецЦикла;

КонецЦикла;
Показать
Найденные решения
5. nomad_irk 57 24.11.21 09:18 Сейчас в теме
(1)в зависимости как именно вы хотите проверить наличие документов:

///За циклом:
Запрос = Новый Запрос;

......


Если Объект.Движения.Содержит(Метаданные.РегистрыБухгалтерии.Хозрасчетный) Тогда

Запрос.Текст = "Выбрать Документы.Ссылка ИЗ &Таблица КАК Документы";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Таблица", Объект.ПолноеИмя());

//ИЛИ

Запрос.Текст = "Выбрать Регистратор ИЗ РегистрБухгалтерии.Хозрасчетный ГДЕ Регистратор ССЫЛКА &Документ";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Документ", Объект.ПолноеИмя());

Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
//Значит документы есть
КонецЕсли;

КонецЕсли;
Показать
user1671936; +1 Ответить
10. AnryMc 818 24.11.21 09:41 Сейчас в теме
(5)
Запрос.Текст = "Выбрать ПЕРВЫЕ 1 Документы.Ссылка ИЗ &Таблица КАК Документы";


Достаточно
user1671936; +1 Ответить
13. nomad_irk 57 24.11.21 09:48 Сейчас в теме
(12)Опять же, если вам нужны все ссылки по каждому виду документов, то будет лучше сделать запрос объединение:

Выбрать ссылка Из Документ.Документ1
ОБЪЕДИНИТЬ ВСЕ
Выбрать ссылка Из Документ.Документ2


и запросом сразу получить все, что нужно.

Если ссылки на все документы не нужны, то, как правильно заметили в (10), будет достаточно запроса вида:

Выбрать Первые 1 Ссылка Из Документ.Документ1
user1671936; +1 Ответить
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
4. AnryMc 818 24.11.21 09:18 Сейчас в теме
(1)
как проверить существование документа в базе?


Если Эл.Количество() > 0 Тогда
6. nomad_irk 57 24.11.21 09:21 Сейчас в теме
(4)
Если Эл.Количество() > 0 Тогда

получите ошибку
5. nomad_irk 57 24.11.21 09:18 Сейчас в теме
(1)в зависимости как именно вы хотите проверить наличие документов:

///За циклом:
Запрос = Новый Запрос;

......


Если Объект.Движения.Содержит(Метаданные.РегистрыБухгалтерии.Хозрасчетный) Тогда

Запрос.Текст = "Выбрать Документы.Ссылка ИЗ &Таблица КАК Документы";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Таблица", Объект.ПолноеИмя());

//ИЛИ

Запрос.Текст = "Выбрать Регистратор ИЗ РегистрБухгалтерии.Хозрасчетный ГДЕ Регистратор ССЫЛКА &Документ";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Документ", Объект.ПолноеИмя());

Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
//Значит документы есть
КонецЕсли;

КонецЕсли;
Показать
user1671936; +1 Ответить
10. AnryMc 818 24.11.21 09:41 Сейчас в теме
(5)
Запрос.Текст = "Выбрать ПЕРВЫЕ 1 Документы.Ссылка ИЗ &Таблица КАК Документы";


Достаточно
user1671936; +1 Ответить
11. nomad_irk 57 24.11.21 09:43 Сейчас в теме
(10)Судя по коду ТС - нет, нужны именно все ссылки на документы
2. VladimirB 10 24.11.21 08:48 Сейчас в теме
(1) вы же здесь цикл по метаданным делаете. Так вы не проверите есть ли документ в базе (ссылка).
3. VladimirB 10 24.11.21 08:52 Сейчас в теме
Типа этого может быть ?

Для Каждого Эл Из ОбъектыМД Цикл
       Для Каждого ДокСсылка Из Документы[Эл]  Цикл
7. nomad_irk 57 24.11.21 09:26 Сейчас в теме
(3)
Для Каждого ДокСсылка Из Документы[Эл] Цикл


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

Для Каждого ДокСсылка Из Документы["Документы"] Цикл

Если Документ с именем "Документы" в дереве метаданных существует, то выполнится, но ссылок вы не получите, если документа в дереве метаданных нет, то будет ошибка.
8. user1619761 24.11.21 09:30 Сейчас в теме
(7) Да, у меня ошибка вылезла,что поле объекта не обнаружено. Сейчас пробую вот так:

Если Объект.Движения.Содержит(Метаданные.РегистрыБухгалтерии.Хозрасчетный) Тогда				
				
				ТипДокумента = Объект.Имя;
				ВыборДок = Документы[ТипДокумента].Выбрать();
				
				Пока ВыборДок.Следующий() Цикл
				
				Если ЗначениеЗаполнено(ВыборДок.Ссылка) Тогда
					
				Сообщить(Объект);
				
				КонецЕсли;
			        КонецЦикла;
			        КонецЕсли;
Показать


Если не получится, попробую метод, что вы выше написали. Спасибо!
9. nomad_irk 57 24.11.21 09:33 Сейчас в теме
(8)Таким образом вы проверяете наличие любого документа выбранного типа.
Если это правильно по логике вашего кода, то можно делать так, но при существовании большого количества документов процесс может сильно затянуться по времени.
12. user1619761 24.11.21 09:45 Сейчас в теме
(9) я уже это понял, опытным путем, когда на цикле завис :D. Буду пробовать ваш метод. Спасибо!
13. nomad_irk 57 24.11.21 09:48 Сейчас в теме
(12)Опять же, если вам нужны все ссылки по каждому виду документов, то будет лучше сделать запрос объединение:

Выбрать ссылка Из Документ.Документ1
ОБЪЕДИНИТЬ ВСЕ
Выбрать ссылка Из Документ.Документ2


и запросом сразу получить все, что нужно.

Если ссылки на все документы не нужны, то, как правильно заметили в (10), будет достаточно запроса вида:

Выбрать Первые 1 Ссылка Из Документ.Документ1
user1671936; +1 Ответить
14. user1619761 24.11.21 10:41 Сейчас в теме
15. Aitbay 25.11.21 07:48 Сейчас в теме
я так понял автору необходимо понимать есть ли документ как (тип) объект в базе
если правильно понял то, я сначала 1 раз загоняю все возможные Типы, имена, объектов в массив, потом уже при передаче данных просто делаю поиск в массиве так думаю быстрее,
хотя могу и ошибаться

вот пример создания массива

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

Далее уже поиск в массиве
****
Если МассивТиповТекст.Найти(TYPEДок) <> Неопределено Тогда
****
КонецЕсли


и если найден тип документа как объект в базе то уже происходит поиск по Гуиду 

чтото вроде

ИскомыйДок =  XMLЗначение(Тип("ДокументСсылка."+ИмяДокумента), Строка(Guid));

ссылкаПоГуиду = Документы[ИмяДокумента].ПолучитьСсылку(Новый УникальныйИдентификатор(Строка(Guid)));

Если СтрНайти(Строка(ИскомыйДок), "<Объект не найден>")>0 Тогда

****
Иначе
****
КонецЕсли
Показать
Оставьте свое сообщение
Вопросы с вознаграждением
Вакансии
Администратор 1C
Москва
зарплата до 110 000 руб.
Полный день

Консультант-аналитик 1С
Москва
зарплата до 180 000 руб.
Полный день

Программист 1С
Москва
зарплата до 160 000 руб.
Полный день

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству