Перейти до змісту
ТЕО
Передрелізний огляд · жовтень 2026

З 1С на Niko: перекладач коду й понять

Знаєте 1С? Ви вже знаєте Niko.

Niko — облікова платформа з тією ж моделлю, що й 1С і BAS: довідники, документи, регістри, проведення, запити з віртуальними таблицями. Нові тут мова й технології: JavaScript, PostgreSQL, робота в браузері та ваш власний сервер.

1С · BAS Niko
  • ОбработкаПроведения(Отказ, РежимПроведения) → onPost(registers, cancel, mode)
  • Движения.ТоварыНаСкладах.ДобавитьПриход() → registers.StockBalance.addReceipt({…})
  • РегистрНакопления.ТоварыНаСкладах.Остатки(&Период) → AccumRegister.StockBalance.Balance(&Period)
  • Константы.ОсновнаяВалюта.Получить() → niko.constants.get('MainCurrency')
  • Отказ = Истина; → cancel.value = true;
Перекладач коду

Вісім типових задач — двома мовами

Кожна задача облікової системи записана двічі: так, як її пишуть у 1С, і так, як те саме виглядає в Niko. Однаковий колір смужки біля рядка означає одну й ту саму думку в обох мовах — наведіть курсор або торкніться рядка.

Проведення документа надходження

ОбработкаПроведения → onPost

1С · BAS Модуль об'єкта · Документ.ПоступлениеТоваров
1 Процедура ОбработкаПроведения(Отказ, РежимПроведения)
2
3 Движения.ТоварыНаСкладах.Записывать = Истина;
4 Для Каждого Строка Из Товары Цикл
5 Движение = Движения.ТоварыНаСкладах.ДобавитьПриход();
6 Движение.Период = Дата;
7 Движение.Склад = Склад;
8 Движение.Номенклатура = Строка.Номенклатура;
9 Движение.Количество = Строка.Количество;
10 Движение.Сумма = Строка.Сумма;
11 КонецЦикла;
12
13 Движения.Взаиморасчеты.Записывать = Истина;
14 Движение = Движения.Взаиморасчеты.ДобавитьПриход();
15 Движение.Период = Дата;
16 Движение.Контрагент = Поставщик;
17 Движение.Сумма = СуммаДокумента;
18
19 КонецПроцедуры
Niko Модуль об'єкта · Document.GoodsReceipt
1 async function onPost(registers, cancel, mode) {
2 // попередні рухи документа платформа очищає сама
3 for (const row of items) {
4 registers.StockBalance.addReceipt({
5 period: date,
6 warehouse,
7 item: row.item,
8 quantity: row.quantity,
9 amount: row.amount
10 });
11 }
12
13 registers.MutualSettlements.addReceipt({
14 period: date,
15 counterparty: supplier,
16 amount: totalAmount
17 });
18 }
  • Реквізити документа (date, warehouse, items) доступні в скрипті як звичайні змінні, так само як у модулі об'єкта 1С.
  • Рядок Записывать = Истина не потрібен: Niko сам видаляє попередні рухи документа і записує нові в одній транзакції.
  • Блокування за вимірами регістрів платформа ставить автоматично і в сталому порядку, тому паралельні проведення не блокують одне одного намертво.

Заповнення нового документа і перевірка перед записом

ОбработкаЗаполнения, ПередЗаписью → onFill, beforeWrite

1С · BAS Модуль об'єкта · Документ.ПоступлениеТоваров
1 Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
2 Дата = ТекущаяДатаСеанса();
3 Валюта = Константы.ОсновнаяВалюта.Получить();
4 КонецПроцедуры
5
6 Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
7 Если Не ЗначениеЗаполнено(Склад) Тогда
8 Сообщить("Вкажіть склад");
9 Отказ = Истина;
10 Возврат;
11 КонецЕсли;
12 Если Товары.Количество() = 0 Тогда
13 Сообщить("Додайте товари");
14 Отказ = Истина;
15 КонецЕсли;
16 КонецПроцедуры
Niko Модуль об'єкта · Document.GoodsReceipt
1 async function onFill(cancel) {
2 this.date = niko.sys.now();
3 this.currency = await niko.constants.get('MainCurrency');
4 }
5
6 async function beforeWrite(cancel, mode) {
7 if (!warehouse) {
8 cancel.message = 'Вкажіть склад';
9 cancel.value = true;
10 return;
11 }
12 if (!items || items.length === 0) {
13 cancel.message = 'Додайте товари';
14 cancel.value = true;
15 }
16 }
  • onFill спрацьовує для нового об'єкта, як ОбработкаЗаполнения. Значення записуються через this.
  • Відмову описує один об'єкт cancel: прапорець value і текст message, який побачить користувач.
  • Повний цикл подій: beforeWrite, onWrite, beforeDelete, beforePost, onPost, onUnpost, onFill, onCopy.

Запит до залишків на складі

Запрос + Остатки() → niko.query + Balance()

1С · BAS Загальний модуль · Склад
1 Функция ОстаткиНаСкладе(Склад, Дата) Экспорт
2 Запрос = Новый Запрос;
3 Запрос.Текст =
4 "ВЫБРАТЬ
5 | Остатки.Номенклатура.Наименование КАК Товар,
6 | Остатки.КоличествоОстаток КАК Количество
7 |ИЗ
8 | РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Остатки
9 |ГДЕ
10 | Остатки.КоличествоОстаток > 0";
11 Запрос.УстановитьПараметр("Период", Дата);
12 Запрос.УстановитьПараметр("Склад", Склад);
13
14 Результат = Новый Массив;
15 Выборка = Запрос.Выполнить().Выбрать();
16 Пока Выборка.Следующий() Цикл
17 Результат.Добавить(Выборка.Товар + ": " + Выборка.Количество);
18 КонецЦикла;
19 Возврат Результат;
20 КонецФункции
Niko Загальний модуль · Stock
1 async function stockOnWarehouse(warehouse, date) {
2 const rows = await niko.query(`
3 SELECT
4 i.Description AS item,
5 b.quantityBalance AS quantity
6 FROM
7 AccumRegister.StockBalance.Balance(&Period, warehouse = &Warehouse) AS b
8 LEFT JOIN Catalog.Items AS i ON b.item = i.Ref
9 WHERE
10 b.quantityBalance > 0`,
11 { Period: date, Warehouse: warehouse });
12
13 return rows.map(row => row.item + ': ' + row.quantity);
14 }
15
16 // експорт функцій загального модуля, аналог слова Экспорт
17 return { stockOnWarehouse };
  • Віртуальні таблиці Balance, Turnovers, SliceLast і SliceFirst приймають період і відбір так само, як Остатки, Обороты і зрізи в 1С.
  • Імена в запиті логічні. Niko перекладає їх у таблиці PostgreSQL і додає обмеження доступу користувача на рівні записів (RLS).
  • Розіменування через крапку (Номенклатура.Наименование) записується явним LEFT JOIN.

Ціна продажу на дату

Константы + ПолучитьПоследнее → niko.constants + sliceLast

1С · BAS Загальний модуль · Ценообразование
1 Функция ЦенаПродажи(Номенклатура, Дата) Экспорт
2 ТипЦен = Константы.ОсновнойТипЦен.Получить();
3 Отбор = Новый Структура("Номенклатура, ТипЦен", Номенклатура, ТипЦен);
4 Цены = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(Дата, Отбор);
5 Возврат Цены.Цена;
6 КонецФункции
Niko Загальний модуль · Pricing
1 async function salePrice(item, date) {
2 const priceType = await niko.constants.get('MainPriceType');
3 const filter = { item, priceType };
4 const prices = await niko.registers.sliceLast('ItemPrices', filter, date);
5 return prices ? prices.price : 0;
6 }
  • Новый Структура стає звичайним об'єктом JavaScript: { item, priceType }.
  • Зріз останніх, залишки й обороти читаються одним викликом без тексту запиту: sliceLast, balance, turnovers. Це працює в подіях, проведенні й загальних модулях.
  • Якщо записів немає, результат дорівнює null, тож значення за замовчуванням задається явно.

Створення і проведення документа з коду

СоздатьДокумент() → niko.documents.create

1С · BAS Загальний модуль · Склад
1 Функция СоздатьСписание(Склад, Товары) Экспорт
2 Док = Документы.СписаниеТоваров.СоздатьДокумент();
3 Док.Дата = ТекущаяДатаСеанса();
4 Док.Склад = Склад;
5 Для Каждого Строка Из Товары Цикл
6 ЗаполнитьЗначенияСвойств(Док.Товары.Добавить(), Строка);
7 КонецЦикла;
8 Док.Записать(РежимЗаписиДокумента.Проведение);
9 Возврат Док.Номер;
10 КонецФункции
Niko Загальний модуль · Stock
1 async function createWriteOff(warehouse, items) {
2 const result = await niko.documents.create('WriteOff', {
3 // дата за замовчуванням поточна
4 warehouse,
5 items
6 }, { post: true });
7 return result.number;
8 }
  • create повертає { ref, number, posted }: посилання, номер і ознаку проведення.
  • { post: true } записує і проводить документ тим самим шляхом, що й форма, з тими самими правами доступу.
  • Для покрокового заповнення є niko.documents.new(): чернетка з методами write() і post().

Обробник поля форми з викликом сервера

&НаКлиенте + ВызовСервера → api + niko.server.invoke

1С · BAS Форма документа і загальний модуль
1 // Модуль формы документа
2 &НаКлиенте
3 Процедура ПоставщикПриИзменении(Элемент)
4 Валюта = ПоставщикиВызовСервера.ВалютаРасчетов(Объект.Поставщик);
5 Если ЗначениеЗаполнено(Валюта) Тогда
6 Объект.Валюта = Валюта;
7 КонецЕсли;
8 КонецПроцедуры
9
10 // Общий модуль ПоставщикиВызовСервера (Сервер, Вызов сервера)
11 Функция ВалютаРасчетов(Поставщик) Экспорт
12 Возврат Поставщик.ВалютаРасчетов;
13 КонецФункции
Niko Форма документа і загальний модуль
1 // Модуль форми документа виконується в браузері
2 async function supplierOnChange(api, fieldName, value) {
3 const currency = await niko.server.invoke('Suppliers', 'currencyOf', [value]);
4 if (currency) {
5 api.setValue('currency', currency);
6 }
7 }
8
9 // Загальний модуль Suppliers (серверний)
10 async function currencyOf(supplier) {
11 const rows = await niko.query(
12 'SELECT c.settlementCurrency AS currency ' +
13 'FROM Catalog.Counterparties AS c WHERE c.Ref = &Ref',
14 { Ref: supplier });
15 return rows.length ? rows[0].currency : null;
16 }
17 return { currencyOf };
  • Модуль форми виконується в браузері, загальний модуль із прапорцем «Сервер» виконується на сервері. Директиви компіляції не потрібні.
  • Виклик сервера асинхронний: await чекає відповіді, а інтерфейс тим часом не зависає.
  • Функції загального модуля експортуються рядком return { … } наприкінці модуля замість слова Экспорт.

HTTP-сервіс, що повертає ціну товару

HTTPСервисОтвет → { status, body }

1С · BAS HTTP-сервіс · Цены
1 Функция ЦенаGET(Запрос)
2 Код = Запрос.ПараметрыЗапроса.Получить("code");
3 Товар = Справочники.Номенклатура.НайтиПоКоду(Код);
4 Если Товар.Пустая() Тогда
5 Возврат Новый HTTPСервисОтвет(404);
6 КонецЕсли;
7 Цены = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(,
8 Новый Структура("Номенклатура", Товар));
9
10 Запись = Новый ЗаписьJSON;
11 Запись.УстановитьСтроку();
12 ЗаписатьJSON(Запись, Новый Структура("code, price", Код, Цены.Цена));
13
14 Ответ = Новый HTTPСервисОтвет(200);
15 Ответ.Заголовки.Вставить("Content-Type", "application/json");
16 Ответ.УстановитьТелоИзСтроки(Запись.Закрыть());
17 Возврат Ответ;
18 КонецФункции
Niko HTTP-сервіс · Prices
1 // GET /api/public/<база>/Prices/price?code=0001
2 async function price(req) {
3 const rows = await niko.query(`
4 SELECT p.price
5 FROM InfoRegister.ItemPrices.SliceLast(,
6 item IN (SELECT Ref FROM Catalog.Items WHERE Code = &Code)) AS p`,
7 { Code: req.query.code });
8
9 if (rows.length === 0) {
10 return { status: 404, body: { error: 'Товар не знайдено' } };
11 }
12 return {
13 status: 200,
14 body: { code: req.query.code, price: rows[0].price }
15 };
16 }
  • Обробник отримує { body, query, headers, method, ip } і повертає { status, headers, body }.
  • JSON рідний для мови: об'єкт у body серіалізується сам, без ЗаписьJSON.
  • Адреса методу: /api/public/<база>/<сервіс>/<метод>.

Підписка на подію: перевірка коду ЄДРПОУ

ПодпискаНаСобытие → EVENT_SUBSCRIPTION

1С · BAS Підписка на подію · Контрагенты
1 // Подписка на событие ПроверкаЕДРПОУ
2 // Событие: ПередЗаписью. Источник: СправочникОбъект.Контрагенты
3 Процедура ПроверкаЕДРПОУПередЗаписью(Источник, Отказ) Экспорт
4 Код = СокрЛП(Источник.КодПоЕДРПОУ);
5 Если СтрДлина(Код) <> 8
6 Или Не СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Код) Тогда
7 Сообщить("Код ЄДРПОУ має містити 8 цифр");
8 Отказ = Истина;
9 КонецЕсли;
10 КонецПроцедуры
Niko Підписка на подію · Counterparties
1 // Підписка на подію EdrpouCheck
2 // Подія: beforeWrite. Джерело: Catalog.Counterparties
3 async function beforeWrite(cancel, mode) {
4 const code = String(edrpou || '').trim();
5 if (!/^\d{8}$/.test(code)) {
6 cancel.message = 'Код ЄДРПОУ має містити 8 цифр';
7 cancel.value = true;
8 }
9 }
  • Підписка є окремим об'єктом конфігурації з подією і списком джерел, як у 1С.
  • Обробник має ту саму сигнатуру, що й подія об'єкта, а поля джерела доступні як змінні.
  • Підписки на onPost виконуються після успішного проведення, тож через них зручно створювати підлеглі документи.

Приклади перекладено вручну, щоб показати відповідність понять. Автоматичного конвертора коду 1С у поточній версії Niko немає. Код Niko звірено з чинним runtime платформи, а запити перевірено транслятором NiKo SQL.

Словник понять

Ті самі об'єкти конфігурації — інші імена

Об'єкти конфігурації виконують ті самі ролі. Змінюються імена, якими ви звертаєтесь до них у коді та в запитах.

Поняття 1С · BAS Niko
Дані
Довідник Справочники.Номенклатура Catalog.Items
Документ Документы.ПоступлениеТоваров Document.GoodsReceipt
Таблична частина Объект.Товары items у модулі, Document.GoodsReceipt.items у запиті
Перелік Перечисления.ПричиныСписания Enum.WriteOffReasons
Константа Константы.ОсновнаяВалюта.Получить() niko.constants.get('MainCurrency')
Журнал документів ЖурналыДокументов.Склад DOCUMENT_JOURNAL — журнал документів
Регістри
Регістр відомостей РегистрСведений.Цены.СрезПоследних() InfoRegister.Prices.SliceLast()
Залишки РегистрНакопления.Товары.Остатки() AccumRegister.Stock.Balance()
Обороти РегистрНакопления.Товары.Обороты() AccumRegister.Stock.Turnovers()
План рахунків і регістр бухгалтерії РегистрБухгалтерии.Хозрасчетный Accounting_Register.Main
План видів характеристик ПланыВидовХарактеристик.Свойства ChartOfCharacteristicTypes.Props
План видів розрахунку і регістр розрахунку РегистрРасчета.Начисления CalculationRegister.Payroll
Код і сервіси
Модуль об'єкта ОбработкаПроведения, ПередЗаписью onPost, beforeWrite
Загальний модуль ОбщийМодуль.Метод(Параметр) niko.modules.invoke('Module', 'method', [param])
Підписка на подію ПодпискаНаСобытие EVENT_SUBSCRIPTION — підписка на подію
Регламентне завдання РегламентноеЗадание SCHEDULED_JOB — планове завдання
HTTP-сервіс Новый HTTPСервисОтвет(200) return { status: 200, body }
Бізнес-процес і задача БизнесПроцессы, Задачи BUSINESS_PROCESS, TASK
Розробка й адміністрування
Права доступу Роли, ограничение доступа к данным ROLE — ролі та RLS, які автоматично додаються до запитів
План обміну ПланыОбмена.Филиалы EXCHANGE_PLAN — план обміну між вузлами
Компонування даних СКД компонування звітів: набори, групування, підсумки, експорт у XLSX
Сховище конфігурації Хранилище конфигурации commit · diff · rollback — історія конфігурації
Налагодження Отладчик конфигуратора налагоджувач у браузері з точками зупинки
Розмовник

Конструкції вбудованої мови 1С і JavaScript

Запити й параметри &Параметр пишуться так само, змінюються лише імена об'єктів.

  • Процедура Имя(Параметр) … КонецПроцедуры function name(param) { … }
  • Функция Имя() Экспорт return { name }; — наприкінці загального модуля
  • Если А Тогда … ИначеЕсли Б Тогда … Иначе … КонецЕсли; if (a) { … } else if (b) { … } else { … }
  • Для Каждого Строка Из Товары Цикл for (const row of items) {
  • Для Н = 1 По 10 Цикл for (let n = 1; n <= 10; n++) {
  • Пока Выборка.Следующий() Цикл for (const row of rows) {
  • Отказ = Истина; cancel.value = true;
  • Сообщить("Вкажіть склад"); cancel.message = 'Вкажіть склад';
  • Новый Структура("Код, Цена", К, Ц) { code: c, price: p }
  • Массив = Новый Массив; Массив.Добавить(Х); const list = []; list.push(x);
  • Истина, Ложь, Неопределено true, false, null
  • Если ЗначениеЗаполнено(Склад) Тогда if (warehouse) {
  • СокрЛП(Стр), СтрДлина(Стр), ВРег(Стр) s.trim(), s.length, s.toUpperCase()
  • ТекущаяДатаСеанса() niko.sys.now()
  • Попытка … Исключение … КонецПопытки; try { … } catch (e) { … }
  • ВызватьИсключение "Немає рецептури"; throw new Error('Немає рецептури');
  • Запрос.УстановитьПараметр("Склад", Склад); niko.query(text, { Warehouse: warehouse })
  • ДокСсылка.ПолучитьОбъект().Записать(РежимЗаписиДокумента.Проведение); await niko.documents.post(ref);
Що отримує команда

Модель і звички лишаються. Інструменти стають сучасними

web

Браузер замість тонкого клієнта

Конфігуратор, форми і звіти відкриваються в браузері. На робочі місця нічого не встановлюється.

PostgreSQL

Схема бази з метаданих

Таблиці платформа будує й оновлює сама за описом конфігурації, як під час оновлення конфігурації бази даних у 1С.

isolated-vm

Код у пісочниці

Серверні скрипти конфігурації виконуються в ізольованому середовищі з обмеженням часу й пам’яті.

commit · diff

Історія конфігурації

Кожну версію можна зафіксувати, порівняти з попередньою і відкотити. Конфігурація вивантажується в ZIP і завантажується назад.

debugger

Налагоджувач і конструктори

Точки зупинки в подіях і проведенні, конструктор запитів, дизайнер форм, компонування звітів з експортом у XLSX.

on-premise

Ваш сервер і ваші дані

Платформа розгортається на сервері компанії. Плани обміну синхронізують розподілені бази між вузлами.

Де ми зараз

Niko готується до релізу

Ядро обліку вже працює на реальній галузевій конфігурації, і кожен приклад на цій сторінці звірено з поточним кодом платформи.

87

об'єктів метаданих у пілотній конфігурації ресторанного обліку: склад, закупівлі, рецептури, виробництво, продажі, взаєморозрахунки.

12

наскрізних сценаріїв, які проходять на живій базі PostgreSQL: від надходження товарів до чека, списання за рецептурою і відкату проведення.

POS

касовий модуль для ресторанів із клієнтом для Windows: меню і карта залу беруться з конфігурації, а чек із каси проводиться як звичайний документ.

Ранній доступ

Шукаємо команди, які переходять з 1С або BAS і готові до пілотного впровадження. Ваші розробники зможуть читати код Niko з першого дня.

Стати пілотною командою

1С, 1С:Підприємство та BAS є торговельними марками відповідних власників. Niko з ними не пов'язана.

Зворотний зв'язок

Станьте пілотною командою Niko

Розкажіть, на якій конфігурації 1С або BAS ви працюєте зараз і скільки в команді розробників — покажемо Niko і обговоримо пілот.

  • Відповідаємо в робочий час, зазвичай того ж дня
  • Демонстрація та первинна консультація — безкоштовно
  • Без спаму й передачі ваших даних третім особам

Залишити заявку

Поля з * обов'язкові.

Надсилаючи заявку, ви погоджуєтесь з політикою конфіденційності.

Захист від ботів — без капчі