1с 7 получить документ по ссылке
Мы уже познакомились с таким понятием, как объект в 1С , следующим шагом будет логично познакомиться с таким понятием, как ссылка в 1С.
Ссылка указывает на данные экземпляра объекта, но не хранит их, т.е. получив ссылку на конкретный экземпляр объекта, мы сможем узнать всю информацию об экземпляре этого объекта, но не сможем внести какие-нибудь коррективы в эту информацию.
Мы помним, что в платформе 1С 8.3. существуют три вида объектов. Это объекты метаданных, общие объекты и универсальные коллекции значений.
Так вот, ссылка может быть только у объектов метаданных.
Замечу что, ссылка указывает не на сам объект, а на экземпляр объекта. Хотя, очень часто употребляют выражения «ссылка объекта», «ссылка на объект» и т.п.
Все ссылки объектов имеют тип СправочникСсылка. , ДокументСсылка. и т.д.
Ссылку можно использовать в качестве переменной, и также ссылку можно указывать, как реквизит других объектов метаданных.
Например, в моей конфигурации есть справочник Контрагенты.
А также какой-то документ, пусть будет Оплата. И я могу какому-то реквизиту документа Оплата присвоить тип — ссылка на справочник Контрагент.
Это значит, теперь в документе Оплата можно хранить информацию о контрагенте, который сделал оплату.
Если мы используем ссылку в качестве реквизита какого-то объекта, то при редактировании экземпляра, на который указывает ссылка, сам реквизит не изменится.
Поясню на примере. Я выше создал документ Оплата и реквизит Оплативший для этого документа с типом СправочникСсылка.Контрагенты.
Если я переименую элемент справочника Контрагенты.
Затем, зайду обратно в выше созданный документ Оплата, то увижу, что отображение контрагента в реквизите поменялось автоматически.
Что это значит? Это не значит, что реквизит Оплативший элемента и сам элемент справочника Номенклатура поменялся автоматически. Нет, это значит, что данный реквизит хранит указатель на экземпляр объекта, который отображается посредством наименования. Поменяли наименование, поменялось только отображение, если бы поменяли какой-нибудь другой реквизит справочника Контрагенты, то пользователь бы ничего не заметил.
Получить ссылку 1С
Каким образом программно получить ссылку на экземпляр объекта, который уже есть в базе?
Сделать это можно несколькими способами: найти по коду, найти по наименованию, найти по реквизиту и найти по нескольким реквизитам через запрос. Я рассмотрю первые два метода.
Для демонстрации этих методов, на основной форме документа Оплата я создам команду «Установить контрагента», которую размещу в командной панели формы.
При выполнении этой команды я буду в поле Оплативший записывать определенного контрагента. Для этого я создам обработчики команды на клиенте и на сервере.
Первый способ получения ссылки: найти по коду, для поиска по коду необходимо использовать функцию менеджера объекта НайтиПоКоду.
Функция НайтиПоКоду вернёт ссылку на экземпляр объекта справочник Контрагенты, которому соответствует код 000000002. Почему мы задали код в виде строки, а не в виде цифры, например? Чтобы понять это, нужно открыть непосредственно редактор справочника Контрагенты в конфигураторе, перейти на закладку «Данные» и посмотреть, какой тип кода у этого справочника.
Тип кода у справочника Контрагенты — строка, поэтому код мы ищем по строковому значению.
Таким образом, данный код:
возвращает ссылку на справочник Контрагенты, код у которого 000000002. Если такой нет, возвращается пустая ссылка (о них ниже), если с таким кодом несколько элементов, то возвращается один из них, какой конкретно — предугадать невозможно, платформа выберет элемент по своим внутренним идентификаторам.
Рассмотрим синтаксис этой функции для менеджера справочника:
Код – непосредственно тот код, по которому мы ищем наш элемент;
ПоискПоПолномуКоду — если стоит параметр Истина, то поиск будет вестись по кодам всей иерархии, т.е. Вам необходимо будет указывать код каждой группы, куда входит элемент через флеш. Например, так: 001/005/110, где слева будет располагаться самая верхняя группа, а справа непосредственно код элемента.
Данное поле необязательно, по умолчанию – Ложь;
Родитель – для иерархических справочников можно указать группу, тогда поиск будет вестись внутри группы. Данное поле необязательно;
Владелец – для подчиненных справочников можно указать владельца, тогда поиск будет вестись только среди элементов, подчиненных данному владельцу. Данное поле необязательно.
Второй способ получения ссылки: найти по наименованию, для поиска по наименованию необходимо использовать функцию менеджера объекта НайтиПоНаименованию.
Этот способ можно применить только для тех объектов, у которых имеется стандартный реквизит Наименование.
Например, у справочников этот реквизит имеется.
А у документов его нет.
В случае этой функции, поиск ведется по тому значению, которое в поле Наименование объекта
Синтаксис функции для менеджера справочника следующий:
«Наименование» – непосредственно то наименование, по которому мы ищем наш элемент;
«ТочноеСоответствие» — если стоит параметр Ложь, то поиск будет вестись не точно, т.е. когда левая часть наименования элемента и строка поиска будут совпадать (например, Металл и Металл 01), то поиск выдаст результат. Если стоит Истина, то будут найдены только те элементы, наименование которых будет точно совпадать со строкой поиска.
Данное поле необязательно, по умолчанию – Ложь.
Помните это, что по умолчанию поиск ведется не точно;
Параметры «Родитель» и «Владелец» точно такие же, как для процедуры НайтиПоКоду.
Пустая ссылка 1С
У Вас уже, наверное, назрел вопрос: что будут возвращать методы НайтиПоКоду, НайтиПоНаименованию, если такой элемент справочника не был найден. Они будут возвращать Пустую ссылку. Пустая ссылка — это пустое значение какого-нибудь справочника или документа. У менеджеров справочника или документа есть методы, которые возвращают пустую ссылку соответствующих объектов.
Выглядит он так:
ПустаяНоменклатура= Справочники.Номенклатура.ПустаяСсылка();
ПустаяОплата = Документы.Оплата.ПустаяСсылка();
Переменные ПустаяНоменклатура и ПустаяОплата содержат в себе пустые ссылки на каждый объект.
Обращаю Ваше внимание, что для каждого вида справочника и каждого документа будет своя собственная пустая ссылка.
Данный метод очень удобно использовать, когда нам необходимо знать, найден ли элемент справочника по коду (названию) или нет.
ПустаяСсылка() – это метод менеджера объекта. Также есть метод ссылки объекта Пустая(), который возвращает тип булево. Истина — если это пустая ссылка. Код выше можно переделать:
Метод Пустая() удобно использовать работая в клиентском контексте (в том числе на тонком клиенте), потому что менеджер объекта это «тяжелый» объекта и с ним можно работать только в серверном контексте. Т.е. установку контрагента можно сделать таким способом:
В этом коде я получаю по наименованию ссылку на нужного контрагента, делаю это в серверном методе, поскольку обращаюсь к менеджеру справочника, записываю если он не пустой, а потом в клиентском методе проверяю, найден контрагент по такому наименованию или нет, если не найден то вывожу предупреждение.
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника.
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
Доброе время суток. Простите за мою глупость с 7.7 приходилось довольно мало работать.
Сообщить(документ1);
Дата1 = Дата("30.09.11");
Дата2= Дата("30.09.11");
Док=СоздатьОбъект("Документ");
Док.ВыбратьДокументы(Дата1,Дата2);
Пока Док.ПолучитьДокумент()=1 Цикл
если Док = документ1 тогда
Сообщить(Док);
КонецЕсли;
// документ1.Удалить(0);
КонецЦикла;
У меня есть ссылка Документ1 я ее выбираю на форме мне этот документ нужно удалить. Я получила документы по средствам отбора по дате но там около 15 документов не могу сравнить в условии если.
Спасибо помогло. Дело в том что у бухгалтеров вылезла непонятная цифра в 7.7 уже давно их перевела на ЗУП, а тут что то потребовалось в старой базе.
получил документ и через его метод ТекущийДокумент() к нему обращаешься, можно и к реквизитам, но к реквизитам решили , что будет проще так : Док.ДатаДок() чем Док.ТекущийДокумент().ДатаДок - хотя и так и так правильно
(11)
Вы совершенно не понимаете сути ТекущегоДокумента и ТекущегоЭлемента, а значит, не постигли дао клюшек.
(17)
Док.ТекущийДокумент().Записать()
хотя бы.
Постигай дао клюшек.
В восьмерке не зря разделили два этих понятия - объект и ссылка, потому что в 7ке они были "слеплены" воедино и у начинающих вызывали путаницу.
Это первое отличие - через СоздатьДокумент() можно манипулировать документом как объектом - записать, провести, найти, а ТекущийДокумент() - только ссылка на конкретный док - не дает ни записать, ни провести и т.п.
Второе отличие - через ТекущийДокумент() ВСЕГДА получаются значения, хранящиеся на данный момент в базе, а просто у объекта - можно считать уже установленные, но еще не записанные в базу значения реквизитов.
(20)
Мне врать без надобности, просто я свое понимание вопроса не могу взять и переложить в другую голову, каждый должен дойти сам.
ТекущийДокумент() в клюшках это просто такая конструкция, позволяющая обратиться к контексту всего документа сразу. И только. Ни какая это не ссылка .
(25)
Я бы хотел подтянуть вас в знании клюшек повыше, до своего уровня, но увы, рука моя не протягивается настолько вниз.
Мы просто говорим о разных вещах:
Ежу понятно, что не записав документ, получишь разные значения, но при чем здесь менторский тон - я в 7.7 с 2004 года.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой
Столкнулся с проблемой,как получить документ по ссылке COMObject.
Есть две базы : Розница 2.2 и Альфа Авто.
Из Розницы по номеру Чека надо найти в Альфе Чек с таким же номером и сделать в нем некоторые изменения.
: Ошибка при вызове метода контекста (ПолучитьОбъект): Произошла исключительная ситуация: : Процедура или функция с указанным именем не определена (Предупреждение)
Буду очень благодарен за подсказку. Как можно сделать?
(17) в Рознице в Общем модуле Полные права создаешь функцию ОбработатьЧекИзАльфы(НомерДокумента)
номер тебе "приедет", а в самом коде ты работаешь не через КОМ-объект, а как будто сидишь в Рознице
а из Альфы вызываешь
Из Розницы по номеру Чека надо найти в Альфе Чек с таким же номером и сделать в нем некоторые изменения.
- может надо обработку запускать в Альфе, находить в Рознице данные и при необходимости в Альфе производить изменения.
(1) А зачем запрос по ком соединению, если вам нужен всего один документ?
Если Выборка не пустая, то это искомый документ. И проверяйте.
Если использовать команду Выбрать, то можно выбрать документы за период.
(9) Да Найти по номеру я делал,сути это не меняет. Ссылку из внешней базы я получаю и данные этого документа. А мне надо в нем сделать изменения. Как сам документ то получить из внешней базы?
(10)Выборка это и есть документ. Если и его не надо получать. Понимаю что задача стоит в подключенной базе по "кому" надо поменять данные в документе.
у самого есть подобная задача, пока не решал, но в ближайшее время буду решать.
Вариант запустить из Альфы и найти чек в рознице не рассматриваете?
(11) Что толку,что выборка ссылка на COMОбъект документ. Изменить в нем ничего нельзя.
Из Альфы (8.1) подключаюсь к Рознице 2.2 (8.3),
создаю в ней Чек, методы ПолучитьОбъект() и Удалить() с COMОбъектом работают,
А обратно из Розницы в Альфе не работает метод ПолучитьОбъект() по ссылке COMОбъекта.
Ребята,не знаю что придумать? Надо обязательно из Розницы изменить Чек в Альфе. Попробовать создать регистр сведений и через него фиксировать? Неожиданная преграда.
: Ошибка при вызове метода контекста (ПолучитьОбъект): Произошла исключительная ситуация: : Процедура или функция с указанным именем не определена (Предупреждение)ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(27)>
Все работает оказывается! Просто в старых конфах на 8.1 не предполагали работу в разных контекстах. Тогда был только толстый клиент и писали как могли. Для работы тебе либо придется менять модуль, чтобы он мог компилироваться во внешнем соединении. Тестируй модуль на него. Либо переносить все на сторону базы 8.1 тогда модуль можно не трогать! Если обработку запускать не в регламентном задании иначе опять переделывать модуль!
(16), какой модуль менять? Скорее всего это мне не по силам и придется искать другое решение. Всем ,спасибо за участие.
(17) в Рознице в Общем модуле Полные права создаешь функцию ОбработатьЧекИзАльфы(НомерДокумента)
номер тебе "приедет", а в самом коде ты работаешь не через КОМ-объект, а как будто сидишь в Рознице
а из Альфы вызываешь
А если попробовать преобразовывать com объекты?
ЗначениеВСтрокуВнутр
ЗначениеИзСтрокиВнутр?
Чек выписывается в Альфе-Авто (4.1) и пересылается в Розницу,где касса ККТ онлайн.
Эта часть отработана,то есть из Альфы 8.1 во внешнюю базу Розница 2.2 8.3.
А как только в Рознице кассир пробьет чек,который уходит в ФНС,надо в Альфе в исходном чеке сделать как бы отметку,что чек пробит и заблокировать его изменение.
К сожаление,пока ничего из предложенного не подошло.
Когда в отладке смотришь ВыборкаV8.Ссылка, то методы GetObject и другие обозначены ,как Метод не найден.
(7) ну как я писал, похоже получив запросом ссылку, ты получил не ссылку, вот и метод не работает. Получай номер документа, а затем ищи его через функцию. тогда и получить сможешь.
(1) Судя по ошибке - она банальна.
Модуль документа чека альфы не компилируется под внешним соединением.
Криворукие прогеры использовали в потенциально серверной части диалог предупреждения, которого на сервере (и во внешнем соединении) быть не может.
Если есть возможность доработки конфы, просто заверните стремные участки типа этого предупреждения в директивы компиляции только в толстом клиенте.
смотри что у тебя тут -
а так пиши функцию в рознице и туда передавай номер и делай что хочешь
(13), не понял
"а так пиши функцию в рознице и туда передавай номер и делай что хочешь".
Как я получу документ из внешней базы (COMОбъект)?
фактически у тебя получится, что запущен экземпляр Розницы, который через КОМ-соединение получил примитывный тип "Строка", а фактически это полноценно запущенная Розника, которая работает с этой строкой
в Результа можешь возвращать Истина/Ложь, но я у себя возвращаю ГУИД документа в Рознице, чтобы полностью "связать"
Петр Самчук,огромное Вам спасибо! Не только проблема решена,но и новые для меня знания.
В Альфе в общем модуле сделал Процедуру:
А в Рознице код:
Петр Самчук, ООООгромное Вам спасибо! проблема решена и МОЯ. не знал такого решения . Связал Бухию и Управленку по спрвочникам.
Разбираюсь с долгоиграющей обработкой, где есть вот такой кусочек:
Настройка самописная, тот, кто это писал - ленив, конечно, но в отсутствии мозгов я ему не отказываю.
Вопрос - может быть, это я чего-то не знаю, и действительно грамотнее писать
ДокСпец=СоздатьОбъект("Документ");
а потом делать проверку на его вид.
а не так, как я:
ДокСпец=СоздатьОбъект("Документ.Специальности");
и цикл только по документам этого вида.
Если Специальность является реквизитом нескольких видов документов - тогда первый вариант (возможно, для документов вида НЕ Специальности нужна обработка по другому типу),
если только одного - тогда второй сработает.
А в чем проблема ?
Paume
В данном случае - обработка только по этому виду документа.
Проблема - слишком большой объем базы, чтобы перебирать ВСЕ документы.
Ну и опять же - я не могу отрицать, что человек, который это писал, обладает знаниями, которых у меня может и не быть. Короче, пока я не понимаю, почему он все поиски в настройке пишет вот так:
Док = создатьОбъект("документ");
Док.ВыбратьДокументы();
Пока ПолучитьДокумент()=1 цикл
Если Док.Вид()=НужныйВид Тогда
КонецЕсли;
КонецЦикла;
у меня нет уверенности, что это действительно неправильно.
если нужно обрабатывать только один вид документов то его и надо определить в
Док = создатьОбъект("документ.конкретныйвид");
а потом уже можно будет искать к примеру по номеру или еще по чему-нибудь, не перебирая все доки. если база на скуле - нужно тогда цикл запросом заменить в котором можно указать необходимое условие
Ну и опять же - я не могу отрицать, что человек, который это писал, обладает знаниями, которых у меня может и не быть.
Paume
Неа.
Там такая логика описана, что у меня до сих пор голова кругом - не то что реализовать, а просто чтобы придумать такое, нужно быть очень вумным. ))
Там такая логика описана, что у меня до сих пор голова кругом - не то что реализовать, а просто чтобы придумать такое, нужно быть очень вумным. ))
тогда есть смысл эту логику сюда сообщить чтобы люди подсказывали что-то конкретное, а не тыкали пальцем в небо
Дайнеко
Paume! Я хочу придать тебе уверенности, что глядя на написанную дебилом глупость, не надо считать себя неопытным и полагать, что ты не понимаешь чужой "мудрости". "Он же такую большую прогу написал!"
Тогда есть смысл эту логику сюда сообщить чтобы люди подсказывали что-то конкретное, а не тыкали пальцем в небо.
Человек покритиковал, и причем конкретными примерами. Вот и не надо ему пенять "пальцем в небо". Я бы за такое творчество руки отрывал. Может кто меня поддержит, когда я время от времени смотрю типовые конфигурации, диву даюсь, как можно написать так сложно и громоздко. Создалось впечатление, что в 1С одна команда создает гениальные инструменты, и совсем другая команда бывших бухгалтерш лепит не нем хлам.
Если мне не изменяет склероз, то после
ДокСпец=СоздатьОбъект("Документ.Специальность");
не будет работать
ДокСпец.ВыбратьПоЗначению(,,"Специальность",Спр.ТекущийЭлемент());
поэтому, как я понял, там и используется ДокСпец=СоздатьОбъект("Документ");
это во-первых
но во-вторых после
ДокСпец.ВыбратьПоЗначению(,,"Специальность",Спр.ТекущийЭлемент());
хоть убейте не пойму зачем
Если ДокСпец.Специальность=Спр.ТекущийЭлемент() Тогда
оно ведь всегда будет равно
puh14
Не - криво написано.По сути надо определить есть в базе хоть один документ специальность с выбранной специальностью не помеченный на удаление. Запрос спасет отца русской демократии! хотя слова обратныйпорядок настораживают - сколько же там таких документов? Если дофига тогда проще проводить этот документ, и писать например специальность и документ специальность (измерения) + одинресурсик числовой в отдельный регистр остатков. Отмена проведения или пометка на удаление убивают запись в регистре. Плюсы - там ТОЛЬКО проведенные документы, будет летать.
Paume
Код писал человек умный и ленивый ))
По-моему, одно на второе не влияет, ну и наоборот тоже ))
Всем спасибо - то, что хотелось услышать, мною услышано.
Просто вот так вот я обучаюсь - прихожу на работу, получаю настройку, в которой вроде что-то реализовано, а что-то нет, и начинаю копать.
Главная задача - не напортачить в том, что уже работает. Ну, а чтобы понять, что работает правильно, нужно понять, почему же пред. программер написал именно так, а не иначе.
Разбираюсь с долгоиграющей обработкой, где есть вот такой кусочек:
Код ( (Unknown Language)):
ДокСпец=СоздатьОбъект("Документ");
ДокСпец.ОбратныйПорядок(1);
ДокСпец.ВыбратьПоЗначению(,,"Специальность",Спр.ТекущийЭлеме нт());
Пока ДокСпец.ПолучитьДокумент()=1 Цикл
Если ДокСпец.ПометкаУдаления()=0 Тогда
Если ДокСпец.Вид()="Специальности" Тогда
Если ДокСпец.Специальность=Спр.ТекущийЭлемент() Тогда
ОК=0
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Настройка самописная, тот, кто это писал - ленив, конечно, но в отсутствии мозгов я ему не отказываю. ;)
Вопрос - может быть, это я чего-то не знаю, и действительно грамотнее писать
ДокСпец=СоздатьОбъект("Документ");
а потом делать проверку на его вид.
а не так, как я:
ДокСпец=СоздатьОбъект("Документ.Специальности");
и цикл только по документам этого вида.
На оборотной стороне документа word в правой части документа, текст съезжает за границу документа
Добрый вечер. Есть код, который формирует документ из шаблона. И все вроде бы, но происходит что.
Поиск документа
Нужно при нажатии на кнопку искать документ Word на пк и вставлять его имя в список сохранять.
Поиск подчиненного документа 1С 7.7
Конфигурация 7.7 Не могу найти похожих статей. Подскажите плз. Надо перебрать в журнале.
Поиск по содержимому документа
Доброго времени суток! Интересует программа для поиска документов по содержимому (ключевым.
Если Специальность является реквизитом нескольких видов документов - тогда первый вариант (возможно, для документов вида НЕ Специальности нужна обработка по другому типу),
если только одного - тогда второй сработает.
А в чем проблема ?
В данном случае - обработка только по этому виду документа.
Проблема - слишком большой объем базы, чтобы перебирать ВСЕ документы.
Ну и опять же - я не могу отрицать, что человек, который это писал, обладает знаниями, которых у меня может и не быть. Короче, пока я не понимаю, почему он все поиски в настройке пишет вот так:
Док = создатьОбъект("документ");
Док.ВыбратьДокументы();
Пока ПолучитьДокумент()=1 цикл
Если Док.Вид()=НужныйВид Тогда
КонецЕсли;
КонецЦикла;
у меня нет уверенности, что это действительно неправильно.
если нужно обрабатывать только один вид документов то его и надо определить в
Док = создатьОбъект("документ.конкретныйвид");
а потом уже можно будет искать к примеру по номеру или еще по чему-нибудь, не перебирая все доки. если база на скуле - нужно тогда цикл запросом заменить в котором можно указать необходимое условие
Ну и опять же - я не могу отрицать, что человек, который это писал, обладает знаниями, которых у меня может и не быть.
Читайте также: