Экранирование спецсимволов 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. добавляем НА ФОРМУ (видимая часть, слева в редакторе форм)
// назовем ДеревоУзел, принадлежит элементу дерева, связан с добавленной колонкой «Узел»
НовыйЭлемент = Элементы.Добавить(«ДеревоУзел», Тип(«ПолеФормы»), Элементы.Дерево);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = «Дерево.Узел»;

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

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

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