Как изменить представление документа в 1С v 8.3

Допустим для документа Реализация товаров услуг нужно настроить представление в виде «Реализация т/у № 150 от 20.05.2016 (Контрагент: ООО Альфа)». Для этого в модуле менеджера объекта документа создаем обработчики событий получения представления и полей представления:

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
Представление = «Реализация т/у № « + Данные.Номер + » от « + Формат(Данные.Дата,«ДФ=dd.MM.yyyy») + » (Контрагент: «+Строка(Данные.Контрагент)+«)»;
СтандартнаяОбработка=Ложь;
КонецПроцедуры

Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
Поля.Добавить(«Номер»);
Поля.Добавить(«Дата»);
Поля.Добавить(«Контрагент»);
СтандартнаяОбработка=Ложь;
КонецПроцедуры

Где хранится список информационных баз 1С 8.x

При переносе данных с одного компьютера на другой иногда необходимо без запуска 1С узнать список баз, которые отображаются при запуске 1С. Список баз хранится в обычном текстовом файле ibases.v8i. Для каждого пользователя 1С создает свой файл, поэтому необходимо знать имя пользователя, пусть это будет MyUser, пути к файлу указаны ниже:

bases

Версия 1С 8.1

Win XP:
C:\Documents and Settings\MyUser\Application Data\1C\1Cv81\ibases.v8i

Vista, 7, 8:
C:\Users\MyUser\AppData\Roaming\1C\1Cv81t\ibases.v8i

Версия 1С 8.2, 8.3

Win XP:
C:\Documents and Settings\MyUser\Application Data\1C\1CEStart\ibases.v8i

Vista, 7, 8:
C:\Users\MyUser\AppData\Roaming\1C\1CEStart\ibases.v8i

Проверка принадлежности элемента иерархии

Проверять принадлежность элемента справочника вышестоящему элементу или группе можно двумя способами:
1. Запросом
2. Программно

Допустим надо проверить принадлежность некоторого элемента ПодчиненныйКонтрагент справочника Контрагенты элементу ГлавныйКонтрагент этого же справочника.

Запросом

Наличие хотя бы одной записи в запросе говорит о том, что элемент ПодчиненныйКонтрагент подчинен элементу или группе ГлавныйКонтрагент:

Запрос = новый Запрос(«Выбрать
|Контрагенты.Ссылка
|    из
|Справочник.Контрагенты как Контрагенты
|    где
|Контрагенты.Ссылка в Иерархи(&ГлавныйКонтрагент) и Контрагенты.Ссылка |= &ПодчиненныйКонтрагент»);

Запрос.УстановитьПараметр(«ГлавныйКонтрагент», ГлавныйКонтрагент);
Запрос.УстановитьПараметр(«ПодчиненныйКонтрагент»ПодчиненныйКонтрагент);
Если Запрос.Выполнить().Выбрать().Следующий() тогда
    Сообщить(«Элемент подчинен»);
Иначе
    Сообщить(«Элемент НЕ подчинен»);
КонецЕсли;

Программно

Легче данную операцию сделать программно, для этого используется процедура ПринадлежитЭлементу элемента справочника:

Если ПодчиненныйКонтрагент.ПринадлежитЭлементу(ГлавныйКонтрагент) тогда
    Сообщить(«Элемент подчинен»);
Иначе
    Сообщить(«Элемент НЕ подчинен»);
КонецЕсли;

Примечание:
Выражение ГлавныйКонтрагент.ПринадлежитЭлементу(ГлавныйКонтрагент) вернет ЛОЖЬ.

Экранирование спецсимволов XML

Часто требуется сформировать XML код напрямую без использования объектов ЗаписьXML и ДокументDOM и это требует замены спецсимволов в текстовых строках, ниже приведена функция, позволяющая выполнить замену:

Функция ЗаменитьСпецСимволы(_стр)

стр=СтрЗаменить(_стр, «&», «&»);
стр=СтрЗаменить(стр, «»»», «"»); // кавычка
стр=СтрЗаменить(стр, «<«, «&lt;»);
стр=СтрЗаменить(стр, «>», «&gt;»);
стр=СтрЗаменить(стр, «‘», «&apos;»);
Возврат стр;

КонецФункции

Договор РЕПО

В типовой конфигурации необходимо реализовать учет операций РЕПО, не являющейся профессиональным участником рынка ценных бумаг. Под сделкой типа РЕПО понимается сделка по продаже ценных бумаг (ЦБ), при продаже которых у организации возникает обязательство по обратному выкупу указанных ценных бумаг через определенный срок по заранее фиксированной цене. Оценка стоимости ЦБ для целей бухгалтерского и налогового учета осуществляется по средней цене. Оценка первоначальной стоимости ЦБ в бухгалтерском и налоговом учете может различаться. Для целей ПБУ 18/02 она квалифицируется как постоянная разница. В договоре РЕПО указывается Контрагент по сделке РЕПО, Ценная бумага, Количество, Дата продажи в РЕПО, Цена продажи, Дата выкупа из РЕПО, Цена выкупа. В Бухгалтерском учете на дату фактической продажи ЦБ по первой части РЕПО организация признает операционный доход от продажи ЦБ. Сумма поступлений от продажи ЦБ отражается по Дт счета 76 и Кт счета 91 субсчет «Прочие доходы». Стоимость проданных ЦБ признается операционным расходом и списывается со счета 58 субсчет «Паи и акции», в дебет счета 91 «Прочие расходы» Выкупленные ЦБ принимаются к учету по цене выкупа, указанной во второй части сделки РЕПО. Стоимость выкупленных ЦБ отражается по Дт счета 58 «Паи и Акции», в корреспонденции со счетом 76. В налоговом учете доходы (убытки) от реализации ценных бумаг по первой части операции РЕПО не учитываются при определении налоговой базы, таким образом, на дату реализации ЦБ по первой части сделки РЕПО у организации в налоговом учете доходов и расходов не возникает. Для целей налогообложения выкупленные бумаги из РЕПО принимаются к учету по той цене, по которой они учитывались при передаче в РЕПО. На дату выкупа ЦБ разница между ценой приобретения ЦБ по второй части сделки РЕПО и ценой реализации ЦБ по первой части РЕПО включается в состав внереализационных расходов. Предельная величина расхода принимается равной ставке рефинансирования Центрального банка РФ, увеличенной в 1.1 раза. Расчет производится по формуле: SxP*1.1xD/365/100, где S – реально поступившая сумма по первой части сделки РЕПО, P – ставка рефинансирования Центробанка, D – срок действия договора РЕПО в днях (от даты поступления по первой части РЕПО до даты оплаты выкупаемых во второй части РЕПО)

Решение

Суть задачи в том, что некая организация сначала продает свои ценные бумаги по одной цене, затем через некоторое время покупает их по более высокой цене. Для начала создадим саму организацию и заполним параметры учета. Итак, наша организация называется АО «Наша организация», ведется налоговый учет, зададим необходимые данные (Наименование, ИНН, КПП):

org2

создадим рублевый счет

schet2

В учетной политике с начала 2016 года указываем применение расчетов по налогу на прибыль, система налогообложения общая:

uchetPolit 2

Для дальнейших действий потребуется контрагент (в справочнике «контрагенты»), ценными бумагами которого мы владеем, назовем его «АО Орг. ЦБ» :

orgCB_2

Сначала ценные бумаги должны как то появится в базе, для этого создадим объект справочника ЦБ, назовем «ЦБ Первый выпуск»:

cb

В задаче сказано: «Оценка первоначальной стоимости ЦБ в бухгалтерском и налоговом учете может различаться. Для целей ПБУ 18/02 она квалифицируется как постоянная разница«, это значит, что в проводке по «созданию» ЦБ (ценных бумаг) есть сумма по БУ (бухгалтерскому учету) и НУ (налоговому учету) в части ПР (постоянных разниц). Что такое ПР и ВР в налоговом учете, можно поискать в интернете. В условии сказано, что учет ЦБ ведется на счете 58, первая проводка будет выглядеть следующим образом:

1) Дт 58.01.2 Кт 000 Сумма 10000 руб., НУ = 9000 руб., ПР = 1000 руб. Субконто1: Контрагенты — АО Орг. ЦБ, Субконто2: ЦБ Первый выпуск, Кол-во 10 штук

oper15

Почему так а не как-то по другому?

Cумма постоянных разниц и сумма по налоговому учету взята «с потолка», но подчиняется известной формуле: БУ = НУ + ПР + ВР, 10000=9000 + 1000.

С этого момента начинается программирование, основное правило внесения изменений в типовую конфигурацию заключается в следующем: не создавать серьезных препятствий для обновления конфигурации на последующие релизы. Для нашей задачи делаем так  — создаем общую команду «ОбщаяКомандаРЕПО»  и соединяем ее со справочником «Договоры контрагентов» в подменю формы «Печать»:

Comm

Вид кнопки на форме (из конфигуратора):

formaDogovor

В условии сказано «В договоре РЕПО указывается Контрагент по сделке РЕПО, Ценная бумага, Количество, Дата продажи в РЕПО, Цена продажи, Дата выкупа из РЕПО, Цена выкупа.«. Добавляем регистр сведений «РЕПО» с измерениями и ресурсами как показано на рисунке:

RS_REPO

Реквизит «ЦеннаяБумага» имеет тип Справочник.ЦенныеБумаги, все измерения (Организация и Договор) сделаем индексируемыми (Свойства->Индексировать).

Создаем форму записи этого регистра, запрещаем для изменения поля организация, договор и контрагент (они будут заполняться автоматически):

formaREPO

Теперь сделаем так, что бы при нажатии на кнопку «Договор РЕПО» формы Договора контрагента открывалась форма записи регистра сведений РЕПО, связанной с этим договором. Для этого в модуле команды разместим код передающий в форму записи регистра сведений необходимые параметры (ключ записи, если не пустой, и параметры договора для создания новой записи регистра):

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

  ПараметрыФормы = Новый Структура(«Договор, Ключ», ПараметрКоманды,
    ПолучитьКлючЗаписи(ПараметрКоманды));

    ОткрытьФорму(«РегистрСведений.РЕПО.ФормаЗаписи»,
    ПараметрыФормы,
    ПараметрыВыполненияКоманды.Источник,
    ПараметрыВыполненияКоманды.Уникальность,
    ПараметрыВыполненияКоманды.Окно,
    ПараметрыВыполненияКоманды.НавигационнаяСсылка);

КонецПроцедуры

&НаСервере
Функция ПолучитьКлючЗаписи(ПараметрКоманды)

ПараметрыЗаписи = Новый Структура(«Договор», ПараметрКоманды);
  Выборка = РегистрыСведений.РЕПО.Выбрать(ПараметрыЗаписи);
  Ключ = Неопределено;
  Если Выборка.Следующий() Тогда
    Ключ = РегистрыСведений.РЕПО.СоздатьКлючЗаписи(
      Новый Структура(«Организация, Договор»,
      ПараметрКоманды.Организация,
      ПараметрКоманды));
  КонецЕсли;
Возврат Ключ;

КонецФункции

Теперь посмотрим в саму форму записи регистра сведений «РЕПО», в модуле формы при ее создании необходимо заполнять самые важные данные для случая создания новой записи, т.е. данные по договору и организации:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

   Запись.Договор = Параметры.Договор;
   Запись.Организация = Параметры.Договор.Организация;
   Запись.Контрагент = Параметры.Договор.Владелец;

КонецПроцедуры

При записи договора РЕПО отслеживаем что бы были заполнены все поля, для этого в форме записи размещаем код:

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)

//проверить заполненость полей
ПП = новый Массив;
ПП.Добавить(«ДатаНачалаДоговора»);
ПП.Добавить(«НомерДоговора»);
ПП.Добавить(«ЦеннаяБумага»);
ПП.Добавить(«Количество»);
ПП.Добавить(«ДатаПродажиРЕПО»);
ПП.Добавить(«ЦенаПродажи»);
ПП.Добавить(«ДатаВыкупаРЕПО»);
ПП.Добавить(«ЦенаВыкупа»);

для каждого поле из ПП цикл
   Если Не ЗначениеЗаполнено(Запись[поле]) тогда
      сообщить(«Не заполнено поле « + поле);
      Отказ = Истина;
   КонецЕсли;
КонецЦикла;

КонецПроцедуры

Теперь можно добавлять договоры РЕПО к обычным договорам. Добавим в этой форме команду и кнопку удаления записи регистра сведений РЕПО, обработчик команды будет выглядеть так:

&НаКлиенте
Процедура УдалитьЗапись(Команда)
   УдалитьЗаписьСервер();
   ЭтаФорма.Закрыть();
КонецПроцедуры

&НаКлиенте
Процедура УдалитьЗаписьСервер()
   РЕПО = РегистрыСведений.РЕПО;
   ТекЗапись = РЕПО.СоздатьМенеджерЗаписи();
   ТекЗапись.Организация = Запись.Организация;
   ТекЗапись.Договор = Запись.Договор;
   ТекЗапись.Прочитать();
   ТекЗапись.Удалить();
КонецПроцедуры

Установим использование статей затрат в бухгалтерских проводках, для этого зайдем в меню «Главное -> Параметры учета -> закладка «Банк и касса» и установим галку «По статьям движения денежных средств».

statiyzatratuse

В справочнике «Прочие доходы и расходы» (меню: Справочники -> Прочие доходы и расходы) добавим элемент «Прочие операционные доходы (расходы)», вид движения одноименный, для целей НУ — не принимается.

prochdr

В справочнике «Статьи движения денежных средств» (меню: Справочники->раздел «Банк и касса»-> Статьи движения денежных средств) добавим две статьи, они понадобятся далее: «Поступления от погашения займов, от продажи долговых ценных бумаг», вид движения одноименный, «Приобретение долговых ценных бумаг, предоставление займов другим лицам», вид движения одноименный.

sdds

На начало моделируемого периода 01.01.2016 установим ставку налога на прибыль: Справочники -> раздел «Налоги» -> Ставки налога на прибыль, форма справочника заполнится сама собой, кроме даты.

nalogВ бухгалтерский план счетов добавим забалансовый счет (код счета обязательно трехзначный) АКЦ:
* Код «АКЦ»
* Вид — «Активный»
* Наименование «Акции в РЕПО»
* Забалансовый
* Количественный
* Виды субконто: Контрагенты (Суммовой, количественный), Договоры (Суммовой, количественный)
* Налоговый учет

aksnu

Допустим, появился покупатель ЦБ, назовем его «Покупатель ЦБ» и внесем в базу (меню:Справочники-> раздел «Покупки и продажи» -> Контрагенты):

newcust

Добавим договор с видом «Прочее» с этим контрагентом: кнопка «Договоры», добавить элемент и заполнить как показано на рисунке:

dogrepo

Добавляем данные договора по кнопке «Печать»->»Общая команда РЕПО»

addrepo

Сама продажа состоит из 2-х этапов:
* Перечисление денег от покупателя нам;
* Отражение сумма дохода от продажи акций по первой части;
* Списание стоимости акций.

Внесем покупателя в систему — справочник «Контрагенты»

Полезные ссылки:

Специалист 1С Бухгалтерия

РЕПО

Курс лекций по бухгалтерскому учету

Статьи движения денежных средств и Отчет ДДС

Продолжение следует…

Получение всех типов

Динамическое создание элементов или таблиц значений иногда требует задания всех типов, для этого ниже приведен код возвращающий описание таковых:

// Заполняем массив доступных типов. Из этого массива будет выбираться тип редактируемого значения.
МассивДоступныхТипов = Новый Массив;
МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов(«Число»,Новый КвалификаторыЧисла(22, 5, ДопустимыйЗнак.Любой))));
МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов(«Строка»,,Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная))));
МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов(«Дата»,,,Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя))));
МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов(«Булево»)));

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

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

// Добавляем ссылки на перечисления
Для Каждого ЭлементТипа Из Перечисления.ТипВсеСсылки().Типы() Цикл
   МассивДоступныхТипов.Добавить(ЭлементТипа);
КонецЦикла;

// Добавляем ссылки на ПланыВидовХарактеристик
Для Каждого ЭлементТипа Из ПланыВидовХарактеристик.ТипВсеСсылки().Типы() Цикл
   МассивДоступныхТипов.Добавить(ЭлементТипа);
КонецЦикла;

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

// Добавляем ссылки на БизнесПроцессы
Для Каждого ЭлементТипа Из БизнесПроцессы.ТипВсеСсылки().Типы() Цикл
   МассивДоступныхТипов.Добавить(ЭлементТипа);
КонецЦикла;

// Добавляем ссылки на точки маршрута
Для Каждого ЭлементТипа Из БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().типы() Цикл
   МассивДоступныхТипов.Добавить(ЭлементТипа);
КонецЦикла;

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

// Добавляем ссылки на ПланВидовРасчета
Для Каждого ЭлементТипа Из ПланыВидовРасчета.ТипВсеСсылки().Типы() Цикл
   МассивДоступныхТипов.Добавить(ЭлементТипа);
КонецЦикла;

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

Возврат новый ОписаниеТипов(МассивДоступныхТипов);

Динамическое добавление колонки в дерево на управляемой форме 1Сv8.3

Для примера возьмем существующее на форме дерево с именем реквизита «Дерево», пусть в него надо добавить еще одну колонку с названием «Узел» тип строка. С динамическим добавлением элементов на управляемую форму можно разобраться на примере следующего алгоритма действий, все происходит на сервере:

  1. Получить значение реквизита — ДеревоЗначений
  2. Добавить колонку в дерево значений
  3. Добавить реквизит (колонку) дерева на форму (невидимая часть, справа в редакторе форм)
  4. Выгрузить дерево значений в реквизит формы
  5. Добавить на форму элемент колонку дерева (видимая часть, слева в редакторе форм)

Пример кода:

// 1. получаем дерево как програмный объект
ДеревоОбъект = РеквизитФормыВЗначение(«Дерево»);
// 2. добавляем колонку
ДеревоОбъект.Колонки.Добавить(«Узел», Новый ОписаниеТипов(«Строка»));
// 3. создаем РЕКВИЗИТ КОЛОНКИ (невидимая часть, справа в редакторе форм)
МассивДобавляемыхРеквизитов = Новый Массив;
// реквизит принадлежит дереву
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(«Узел», Новый ОписаниеТипов(«Строка»), «Дерево»));
// добавляем реквизит в форму (невидимая часть, справа в редакторе форм)
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

// 4. заполняем дерево (реквизит формы) занчением
ЗначениеВРеквизитФормы(ДеревоОбъект, «Дерево»);
// 5. добавляем НА ФОРМУ (видимая часть, слева в редакторе форм)
// назовем ДеревоУзел, принадлежит элементу дерева, связан с добавленной колонкой «Узел»
НовыйЭлемент = Элементы.Добавить(«ДеревоУзел», Тип(«ПолеФормы»), Элементы.Дерево);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = «Дерево.Узел»;

Как проверить тип колонки таблицы значений

Колонка таблицы значений может иметь один или несколько типов, для проверки необходимо использовать функцию СодержитТип() колонки таблицы значений:

Для Каждого КолонкаТЧ из ТЗ.Колонки цикл
   Если КолонкаТЧ .ТипЗначения.СодержитТип(Тип(«ХранилищеЗначения»))
      Тогда
      ПропуститьКолонку = истина;
   КонецЕсли;
КонецЦикла;

 

Получение таблицы динамического списка

Динамический список удобен для использования в интерфейсе, но когда дело касается получения данных, отображаемых в списке для программной обработки, то приходится пользоваться средствами СКД, как это делать приведено ниже:

&НаСервере
Функция Получить_ТЗ_Из_ДинамическогоСписка()
// получаем схему
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
// получаем настройки
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
// можем добавлять произвольные отборы дополнительно
// НовыйЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
// НовыйЭлементОтбора .ЛевоеЗначение = …
// УстанавливаемыйЭлементОтбора.ВидСравнения = …
//УстанавливаемыйЭлементОтбора.ПравоеЗначение =
// УстанавливаемыйЭлементОтбора.Использование = Истина;

// создаем компоновщик макета и формируем выборку в ТЗ
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип(«ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений»));

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

ТЗ = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТЗ);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат ТЗ;

КонецФункции

Как узнать когда был создан документ в 1С v8 без журнала регистрации

Иногда необходимо знать дату создания документа, ошибочно полагать, что поле «Дата» содержит именно дату создания, тут можно проанализировать идентификатор объекта:

Функция ДатаСозданияСсылки(Ссылка)
// любая ссылка хранит в себе уникальный идентификатор
ГУИД = Ссылка.УникальныйИдентификатор();
// идентфикатор хранит в себе дату и время создания
Строка16 = Сред(ГУИД, 16, 3) + Сред(ГУИД, 10, 4) + Сред(ГУИД, 1, 8);
Разрядность = СтрДлина(Строка16);
ЧислоСек = 0;
// время создания хранится в секундах 
// от 15 октября 1582 года 
// в шестнадцатиричной системе
Для Позиция = 1 По Разрядность Цикл
     ЧислоСек = ЧислоСек +
          Найти(«123456789abcdef»,Сред(Строка16Позиция1))*
          Pow(16Разрядность — Позиция);

КонецЦикла;
ЧислоСек = ЧислоСек / 10000000;
// вычисляем смещение от начальной точки
датаТ = Дата(1582, 10, 15, 04, 00, 00) + ЧислоСек;
// составляем только дату 
датаТ = Дата( Год(датаТ), Месяц(датаТ), День(датаТ), 00, 00, 00);
Возврат датаТ;

КонецФункции