После записи набора записей в регистр сведений пропали все данные. Почему?
Это случилось из-за того, что у набора записей не был установлен отбор. Если отбор не установлен, то такой набор записей распространяется на весь регистр и, конечно, это приведет к перезаписи регистра сведений новым набором. Смотрите также на ИТС "Периодические
регистры сведений", "Проектирование
структуры периодических регистров сведений".
В версии 7.7 была предопределенная процедура ВводНового(). А как с этим в версии 8?
Чтобы определить, вводится ли новый элемент/документ или открыт уже существующий, можно вызвать метод "ЭтоНовый()" в процедуре-обработчике события ПриОткрытии. Если вводится новый элемент, то этот метод возвращает значение Истина, иначе — Ложь.
Как обойти строки табличной части?
Обход строк табличной части проще всего реализуется с помощью цикла "Для
Каждого СтрокаТЧ Из ТабЧасть Цикл". При этом переменной цикла будет являться не номер строки, а вся строка как объект. Если нужен еще номер строки, то можно использовать свойство НомерСтроки или добавить переменную и инкрементировать ее в теле цикла. Есть также возможность использовать обычный цикл "Для...По..Цикл", но необходимо помнить, что индекс 1-го элемента коллекции всегда равен 0 (нулю).
В версии 8 нет периодических реквизитов, а как хранить историю изменения реквизитов объектов?
В версии 8 периодические реквизиты заменены новым более мощным механизмом - регистрами сведений. Эти регистры предназначены для выполнения более широкого спектра задач. Суть регистра сведений такова, что он позволяет хранить информацию практически любого типа на пересечении комбинации измерений. Если регистр сведений сделать "периодическим", то можно будет хранить историю изменения этих значений с различной точностью, например, год, месяц, день, по позиции документа. Подробнее об этом написано в отдельной статье ИТС "Периодические
регистры сведений".
Почему не получается программно изменить элемент справочника?
Видимо, Вы пытаетесь изменять данные в базе данных через объект типа "СправочникСсылка". Объекты данного типа позволяют обращаться к реквизитам и табличным частям в режиме "только чтение". Чтобы изменить данные в базе данных, нужно получить специальный объект для записи — СправочникОбъект. Это возможно с помощью метода "ПолучитьОбъект()". Именно через объект типа "СправочникОбъект" (а также ДокументОбъект, ПланСчетовОбъект и аналогичных) возможно изменение данных в базе данных.
Подробнее о взаимосвязи объектов можно прочитать на диске ИТС в разделе "Работа
с прикладными объектами средствами встроенного языка". Смотрите также раздел "Типы значений, связанные
с прикладными объектами".
Как в форме списка справочника получить ссылку на текущий элемент?
Для получения ссылки на текущий элемент справочника можно обратиться к свойству ТекущаяСтрока элемента управления ТабличноеПоле. Например:
Сообщить("Текущий элемент: " + ЭлементыФормы.СправочникСписок.ТекущаяСтрока);
Другой способ - обратиться к полю Ссылка текущих данных табличного поля:
Сообщить("Текущий элемент: " +
ЭлементыФормы.СправочникСписок.ТекущиеДанные.Ссылка);
Для списков объектных данных (Справочников, Документов,…) эти способы равнозначны, так как поле Ссылка является идентификатором записи. При обращении к спискам регистров свойство ТекущаяСтрока будет выдавать ключ записи регистра, который состоит из нескольких полей. Таким образом, свойство ТекущаяСтрока для всех типов данных выдает значение, идентифицирующее текущую строку.
В контекстах прикладных объектов нет методов ПолучитьАтрибут() и УстановитьАтрибут()
Во встроенном языке 1С:Предприятия 8 введена универсальная возможность обращения к свойствам объектов заданных строкой. Для этого используется конструкция [<ИмяСвойства>]. Например:
ИмяСвойства = "Наименование";
Объект[ИмяСвойства] = Объект[ИмяСвойства] + " Новый";
Почему при обращении через точку к свойствам и методам реквизита, тип которого включает ссылки двух справочников, выдается сообщение об ошибке?
В 1С:Предприятии 8 для реквизитов имеющих составной тип (боле одного типа) независимо от того какие типы в него включены значением по умолчанию является значение Неопределено.
Поэтому выражение Контрагент.Код будет выдавать ошибку, если реквизиту Контрагент не присвоено значение ссылки на один из двух справочников, выбранных в типе этого реквизита.
Как добавить строку в табличную часть документа?
В 1С:Предприятии 8 существуют общие принципы работы с коллекциями. Каждая табличная часть является коллекцией строк. Чтобы добавить строку, нужно вызвать у коллекции метод Добавить. Метод возвращает объект - добавленный элемент коллекции. В случае с табличной частью это будет строка табличной части:
СтрокаСостава = ДокументОбъект.Состав.Добавить();
СтрокаСостава.Количество = 10;
Как проверить тип значения документа, справочника?
Во-первых, во встроенном языке 1С:Предприятия 8 для работы с одним прикладным объектом реализовано несколько типов. Например, задачи, которые в 1С:Предприятии 7.7 решал тип "Документ" решаются теперь несколькими типами. Они разделены по своему назначению. Тип "ДокументСсылка" используется для хранения ссылок на объект базы данных в реквизитах других объектов. Тип "ДокументОбъект" используется для записи и удаления отдельных документов. Тип "ДокументВыборка" используется для перебора документов, хранящихся в базе данных. Существуют и другие типы данных, предназначенные для работы с документом. При написании модулей используются те типы, которые необходимы для решения конкретных задач.
Во-вторых, в 1С:Предприятии 8 нет двух понятий - "Тип" и "Вид". Для каждого объекта метаданных имеется свой набор типов используемых во встроенном языке для работы с описываемым им прикладным объектом. То есть при использовании конфигурации не будет существовать такого типа как "ДокуменСсылка", а будут существовать конкретные типы, например, "ДокументСсылка.Счет", "ДокументОбъект.Счет", "ДокументСсылка.Накладная", и т.д.
Кроме того, в 1С:Предприятии 8 для манипулирования типами используются не их строковые наименования, а специальный тип "Тип". Значение типа Тип может быть получено функцией Тип(), получающей в качестве параметра имя типа.
Чтобы проверить тип значения переменной нужно определить ее тип функцией ТипЗнч() и использовать функцию Тип() для получения типа по имени.
Например:
Если ТипЗнч(Основание) = Тип("ДокументСсылка.ПриходнаяНакладная") Тогда
Как получить имя значения перечисления заданное в метаданных?
Чтобы определить имя значения перечисления заданное в метаданных, имея значение типа ПеречислениеСсылка, необходимо найти объект метаданных и получить его имя.
Метод Метаданные объекта ПеречислениеСсылка, как и у других аналогичных типов, выдает объект метаданных перечисления, а не значения перечисления.
Поиск объекта метаданных значения перечисления может быть выполнен по индексу значения перечисления, полученного у менеджера перечисления.
Например:
ЗначениеПеречисления = Перечисления.ВидыКонтрагентов.Организация;
ИмяПеречисления = ЗначениеПеречисления.Метаданные().Имя;
ИндексЗначенияПеречисления = Перечисления[ИмяПеречисления].Индекс(ЗначениеПеречисления);
ИмяЗначенияПеречисления = Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления[ИндексЗначенияПеречисления].Имя;
Как получить значение ссылки на объект базы данных при работе с объектом и выборкой?
В 1С:Предприятии 8 нет таких методов как ТекущийДокумент() и ТекущийЭлемент(). Значение ссылки на объект базы данных хранится в поле Ссылка. Во всех случаях (при использовании объекта, выборки, запроса и т.д.) значение ссылки можно получить по имени этого поля.
Например:
Выборка = Справочники.Склады.Выбрать();
Пока Выборка.Следующий() Цикл
Склад = Выборка.Ссылка;
КонецЦикла;
Как обрабатывать во встроенном языке ввод на основании и копирование?
В 1С:Предприятии 8 при вызове стандартной команды ввода на основании выполняется создание нового объекта и вызов в модуле объекта обработчика события ОбработкаЗаполнения(). В этом событии должен быть реализован алгоритм заполнения данных объекта из данных объекта-основания. Именно этот обработчик генерируется конструктором ввода на основании. Следует учитывать, что этот обработчик будет использоваться не только при вводе на основании. Он будет вызываться и при вызове метода объекта Заполнить(). Таким образом, он является стандартным местом, в котором реализуется заполнение данных объекта из данных объекта основания без учета того, откуда и зачем вызывается это заполнение. Соответственно в этом обработчике можно только выполнять заполнение данных и нельзя делать каких-либо дополнительных действий связанных с интерфейсом системы.
Аналогично при копировании вызывается обработчик события ПриКопировании(), в котором можно дополнить стандартное заполнение данных выполняемое системой при копировании объекта. Этот обработчик вызывается, как при интерактивном копировании, так и при вызове метода Скопировать().
Кроме того, расширения форм объектов предоставляют свойства ПараметрОснование и ПараметрОбъектКопирования, которые заполняются системой при выполнении стандартных команд ввода на основании и копирования. Значения этих свойств могут использоваться в обработчиках формы для определения того, что при открытии формы выполнялся ввод на основании или копирование.
Можно ли обращаться к переменным, процедурам и функциям модуля снаружи объекта?
В 1С:Предприятии 8 любая переменная, процедура и функция модуля объекта (документа, справочника, обработки, формы и т.д.) может быть объявлена как экспортируемая. Для этого достаточно в ее объявлении указать слово Экспорт.
Например:
Процедура Печать(ТабличныйДокумент) Экспорт
После этого к таким переменным, процедурам и функциям можно обращаться так же, как и к системным свойствам и методам объектов.
Например:
Док.Записать(); //Записать документ
Док.Печать(ТабличныйДокумент); //Сформировать печатную форму
Есть ли в 1С:Предприятии 8 сложные проводки?
Такого понятия в "1С:Предприятии 8" нет. Регистры бухгалтерии бывают двух видов - с поддержкой корреспонденций и без поддержки корреспонденций. Регистр с поддержкой корреспонденций обеспечивает наличие в каждой записи дебетовой и кредитовой части. В регистре без поддержки корреспонденции в каждой записи есть признак - дебетовая она или кредитовая. Регистр с поддержкой корреспонденций обеспечивает ведение учета в традиционной для стран бывшего СССР системе. В этом варианте можно получать любые отчеты, включая отчеты по корреспонденциям между счетами. Регистр без поддержки корреспонденций обеспечивает учет соответствующий типовой западной практике. В этом случае в одной операции может быть несколько дебетовых записей и несколько кредитовых, а равенство дебета и кредита контролируется по операции (регистратору).
Сложные проводки в 1С:Предприятии 7.7 фактически соответствуют варианту с поддержкой корреспонденций, так как в каждой корреспонденции определен дебет и кредит, но, кроме того, в проводке присутствует общая запись, которая фактически никак не влияет на учетный механизм. Наличие двух вариантов регистра в "1С:Предприятии 8" обеспечивает большую гибкость при выборе модели учета.
Что является аналогом метода НайтиЭлемент()?
Для получения значения типа СправочникОбъект по значению типа СправочникСсылка необходимо вызвать метод ПолучитьОбъект(). Например:
СкладСсылка = Константы.ОсновнойСклад.Получить();
СкладОбъект = СкладСсылка.ПолучитьОбъект();
СкладОбъект.Наименование = "Основной";
СкладОбъект.Записать();
Как запретить пользователям непосредственное удаление объектов?
Формы "1С:Предприятия 7.7" не предоставляют пользователю возможности выполнения непосредственного удаления объектов (без пометки на удаление и контроля ссылочной целостности). В "1С:Предприятии 8" в формах имеется команда для выполнения непосредственного удаления. Чтобы отключить использование этой команды необходимо в конфигурации в ролях отключить право "Интерактивное удаление" для всех объектов, для которых такое удаление нежелательно. Можно отключить это право для всех ролей или оставить для ролей пользователей, выполняющих административные функции.
Есть ли аналог метода НазначитьВид()?
В 1С:Предприятии 8 для значений нет понятия Вид. Для каждого справочника, документа и т.д. существует отдельный тип ссылки. То есть при использовании конфигурации не будет существовать такого типа как "ДокуменСсылка", а будут существовать конкретные типы, например, "ДокументСсылка.Счет", "ДокументСсылка.Накладная", и т.д. Соответственно, нет и понятия назначения вида.
Если реквизит объекта или формы имеет составной тип (например, допускает хранение типов "ДокументСсылка.Счет" и "ДокументСсылка.Накладная"), то реквизит по умолчанию будет иметь значение Неопределено. Для того чтобы реквизит имел значение желаемого типа, необходимо просто присвоить ему значение этого типа.
Например:
ПолеВвода2 = Документы.Счет.ПустаяСсылка();
Как отследить пометку на удаление?
В 1С:Предприятии 8 установка пометки удаления объекта не является выделенной операцией. Фактически это изменение свойства ПометкаУдаления и запись объекта.
У объектов существуют специальные методы для установки пометки. Они выполняют указанные действия и выполняют некоторые дополнительные действия, например, для справочника выполняется пометка подчиненных элементов. Но использование этих методов не обязательно.
Соответственно, для определения того, что записывается объект с пометкой удаления, достаточно проверить значение свойства ПометкаУдаления в обработчике ПередЗаписью() объекта. Если необходимо сравнить это значение с предыдущим состоянием, то необходимо в обработчике ПередЗаписью() считать старое значение поля из базы данных.
Более подробно этот вопрос описан в разделе диска ИТС "Особенности использования поля "ПометкаУдаления" объектов базы данных".
Как проверить, что тип значения относится к справочникам, документам и т.д.?
Объекты метаданных, описывающие прикладные объекты, определяют сразу несколько типов, используемых для манипулирования этими прикладными объектами во встроенном языке. Например, для документа Счет будут определены типы ДокументМенеджер.Счет, ДокументСсылка.Счет, ДокументОбъект.Счет, ДокументВыборка.Счет и ДокументСписок.Счет. В некоторых случаях нужно определить, к какому виду объектов метаданных относится конкретное значение.
Для этого можно использовать, например, следующую последовательность действий:
ТипЗначения = ТипЗнч(ВыбСчет);
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗначения);
Если Метаданные.Справочники.Содержит(ОбъектМетаданных) Тогда
Процедуры, объявленные в модуле объекта с ключевым словом Экспорт, доступны только в контексте работы с этим объектом (в данном случае с объектом СправочникОбъект.<имя>) и дополняют контекст объекта, существующий по умолчанию.
Если в модуле формы списка этого справочника попытаться выполнить следующий вызов:
ОтобразитьДанные();
будет получена названая выше ошибка, потому что такой вызов предполагает обращение к глобальному контексту прикладного решения, который не содержит процедуры модулей прикладных объектов.
Поэтому для того чтобы выполнить эту процедуру, следует вызывать ее в контексте объекта справочника:
Элемент = Справочники.СправочникБанки.НайтиПоКоду(1).ПолучитьОбъект();
Элемент.ОтобразитьДанные();
Следует заметить, что процедура ОтобразитьДанные() будет доступна также в контексте модуля формы элемента справочника. Другим словами в модуле формы элемента справочника будет работать вызов:
ОтобразитьДанные();
Так происходит потому, что в контексте модуля формы элемента справочника доступны методы и свойства объекта, являющегося значением основного реквизита формы, - т.е. объекта справочника.
Более подробно можно прочитать об этом в разделе "Контекст формы и основного реквизита формы" на диске информационно-технологического сопровождения (ИТС)..
Как открыть форму подчиненного справочника?
Для того чтобы открыть форму подчиненного справочника, следует сначала получить нужную форму, установить в ней значения свойств ПараметрОтборПоВладельцу или ПараметрВыборПоВладельцу, и затем открыть ее.
Свойство ПараметрОтборПоВладельцу используется при открытии формы списка подчиненного справочника. Оно служит для передачи в форму информации о том, что список нужно отображать по определенному владельцу. В процессе открытия формы будет установлен отбор по указанному владельцу.
Например, процедура в модуле формы элемента справочника Контрагенты, которая открывает форму списка подчиненного справочника ДоговорыВзаиморасчетов, может выглядеть следующим образом:
Форма = Справочники.ДоговорыВзаиморасчетов.ПолучитьФормуСписка();
Форма.ПараметрОтборПоВладельцу = Ссылка;
Форма.Открыть();
Свойство ПараметрВыборПоВладельцу используется для инициализации формы выбора. В этом случае выбор будет выполняться только для элементов с указанным владельцем:
Форма = Справочники.ДоговорыВзаиморасчетов.ПолучитьФормуВыбора();
Форма.ПараметрВыборПоВладельцу = Ссылка;
Форма.Открыть();
В чем отличие балансовых и небалансовых ресурсов регистра бухгалтерии?
Ресурсы регистра бухгалтерии (а также и измерения) могут быть балансовыми или небалансовыми. По балансовым измерениям и ресурсам подсчитываются общие итоги и поддерживается принцип двойной записи. Для небалансовых измерений и ресурсов реализовано раздельное хранение данных по дебету и по кредиту для регистров, поддерживающих корреспонденцию.
Балансовые измерения делят весь учет на замкнутые системы учета (самостоятельные балансы). Например, для балансового измерения "Организация" в регистре бухгалтерии будет создано одно поле – "Организация", и по балансовому измерению "Организация" итог регистра должен быть равен нулю.
Небалансовые измерения разделяют учет независимо по каждому счету. Например, для небалансового измерения "Валюта" будет создано два поля: "ВалютаДт" и "ВалютаКт", и по небалансовому измерению "Валюта" итог в большинстве случаев не будет равен нулю, поскольку существуют корреспонденции между валютными и не валютными счетами.
Отличие балансовых и небалансовых ресурсов заключается в том, что по балансовым ресурсам поддерживается баланс, а по небалансоовым просто ведутся остатки по каждому счету отдельно.
Такой принцип хранения данных увеличивает гибкость автоматизированной системы для отражения хозяйственных операций при учете и планировании.
Как узнать имя вида объекта, например, имя используемого справочника?
Для того чтобы получить имя объекта, следует воспользоваться свойством Имя объекта метаданных, который можно получить методом Метаданные().
Например, если "Справ" - это ссылка на элемент справочника, тогда имя этого справочника, заданное в конфигураторе, можно получить следующим образом:
ИмяСправочника = Справ.Метаданные().Имя;
Для типов, не имеющих метода Метаданные(), можно использовать поиск в структуре метаданных конфигурации. Например, если переменная "ВыборкаНоменклатуры" имеет тип СправочникВыборка.Номенклатура, тогда:
ОбъектОписания = Метаданные.НайтиПоТипу(ТипЗнч(ВыборкаНоменклатуры));
Если ОбъектОписания <> Неопределено Тогда
КонецЦикла;
Более подробная информация содержится в разделе «Особенности использования динамических выборок (выборки данных с помощью метода Выбрать …)» информационно-технологического сопровождения (ИТС).
Как выполнить ввод на основании программно?
Для того чтобы выполнить ввод на основании программно, следует создать новый объект, вызвать у него метод Заполнить() и передать в этот метод значение, на основании которого должен быть создан новый объект. В результате этих действий будет выполнен обработчик события Обработка заполнения, расположенный в модуле нового объекта.
В заключении останется только получить форму объекта, установить свойство расширения формы Параметр основание и открыть ее:
НовыйДокумент = Документы.РасходнаяНакладная.СоздатьДокумент();
НовыйДокумент.Заполнить(ВыбранныйКлиент);
ФормаДок = НовыйДокумент.ПолучитьФорму();
ФормаДок.ПараметрОснование = ВыбранныйКлиент;
ФормаДок.Открыть();
Есть ли в 1С:Предприятии 8 аналог метода НайтиЭлемент()?
Метод НайтиЭлемент() используется в 1С:Предприятии 7.7 для того, чтобы спозиционировать объект агрегатного типа данных на известном элементе справочника.
В 1С:Предприятии 8 для модификации элемента справочника используется объект СправочникОбъект.<имя>. Этот объект может быть получен из имеющейся ссылки на элемент справочника при помощи метода ПолучитьОбъект().
Возможно и обратное: свойство Ссылка объекта справочник возвращает ссылку на имеющийся элемент справочника.
Как добавить записи в независимый регистр сведений?
Для добавления отдельной записи в регистр сведений, не подчиненный регистратору, можно использовать объект РегистрСведенийМенеджерЗаписи.<имя>.
Например, для того, чтобы в независимый регистр сведений «ЗначенияСвойствОбъектов» с измерениями «Объект», «Свойство» и ресурсом «Значение» добавить одну запись, содержащую значение некоторого свойства выбранной номенклатуры, можно использовать следующий код:
МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = ПолеВводаНоменклатура;
МенеджерЗаписи.Свойство = ПолеВводаСвойствоНоменклатуры;
МенеджерЗаписи.Значение = ПолеВводаЗначениеСвойства;
МенеджерЗаписи.Записать();
В результате выполнения этого кода новая запись будет добавлена в регистр, или, если регистр уже содержит запись с выбранными значениями измерений «Объект» и «Свойство», - существующая запись будет заменена новой.
Если требуется добавить несколько записей в регистр сведений, можно использовать объект РегистрСведенийНаборЗаписей.<имя>.
Например, для того, чтобы в тот же самый регистр сведений «ЗначенияСвойствОбъектов» добавить несколько записей о значениях различных свойств выбранной номенклатуры, можно использовать следующий код (предполагается, что свойства и соответствующие им значения находятся в таблице значений «ТаблицаСвойств», сформированной заранее):
НаборЗаписей = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(ПолеВводаНоменклатура);
Для Каждого СтрокаТаблицы Из ТаблицаСвойств Цикл
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Объект = ПолеВводаНоменклатура;
НоваяЗапись.Свойство = СтрокаТаблицы.Свойство;
НоваяЗапись.Значение = СтрокаТаблицы.ЗначениеСвойства;
КонецЦикла;
НаборЗаписей.Записать();
В результате выполнения этого кода новые записи будут добавлены в регистр, или, если регистр уже содержит записи с указанным значением измерения «Объект» (по которому установлен отбор в наборе записей), - существующие записи будут заменены новыми.
Вернуться к списку