На данной странице приведены ответы на часто задаваемые вопросы о настройке и работе в программе управленческого учета СКИФ (Склад-Коммерция-Интернет-Финансы). Подробнее о системе СКИФ.
Раскрыть все пункты

Общие вопросы

  • Какие ограничения у бесплатной версии?
    Вы можете использовать бесплатную версию СКИФ без ограничений по времени как для частных лиц, так и для организаций.
    Платная версия Pro обладает набором дополнительных функций, с которыми можно ознакомиться на странице сравнения версий.
  • Чем СКИФ лучше других программ и сервисов учета?
    СКИФ - это программа на PHP+MySQL, которая устанавливается на вашем сайте или сервере. В отличие от использования сторонних облачных сервисов, это позволяет вам:
    - иметь полный контроль и доступ к системе и вашей базе данных, исключить доступ к данным посторонних
    - дорабатывать систему под свои потребности
    - напрямую интегрировать учет с вашим интернет-магазином и другими сервисами на вашем сайте
    - использовать систему без ограничений по количеству пользователей, размеру базы данных и прочих лимитов, присущих облачным сервисам.
    Другие преимущества

Установка и настройка системы

  • Как начать вести учет в СКИФ. Два простых шага
    Шаг 1. Отправьте запрос из формы заказа.

    Шаг 2. В зависимости от интересующего вас варианта:
    - у вас еще нет сайта и вы заказали установку нашими силами
    Зарегистрируйте хостинг по инструкции и перешлите нам письмо от хостера. Мы развернём на вашем хостинге СКИФ и пришлем пароли доступа.
    - у вас уже есть собственный сайт и вы заказали установку нашими силами
    Пришлите нам пароли к хостингу, мы выполним установку СКИФ на вашем сайте и пришлем пароли входа.
    - у вас уже есть собственный сайт, помощь по установке СКИФ не требуется
    Сразу после отправки формы, вам будет выслана ссылка на скачивание дистрибутива системы. Установите систему на сайт по инструкции.
    - вы хотите вести учет в СКИФ на нашем сервере
    Оплатите размещение на наших серверах на интересующий вас срок. В течение суток мы создадим для вас персональную базу на нашем сервере и пришлем пароли доступа к ней.
    - сайт не нужен, вы хотите вести учет на своем компьютере
    Сразу после отправки формы, вам будет выслана ссылка на скачивание дистрибутива. На странице скачивания выберите вариант для локальной установки. Установите систему на свой компьютер по инструкции.

    Это всё! Сразу после установки в вашем распоряжении работающая система учета. Работа в ней интуитивно понятна, большинство полей и отчетов снабжено контекстной справкой. При необходимости, прочитайте инструкцию пользователя системы учета. Если вы будете использовать сайт, сделайте его настройки.
    Если вы переносите данные из другой программы, можно импортировать товары и клиентов через меню "Справочники-Импорт из Excel".
  • Можно ли установить систему на свой компьютер, а не на сайт?
    Да, вы можете установить программу на собственный компьютер или даже на флэшку, а также открыть доступ к системе с других компьютеров в вашей локальной сети для организации совместной работы. Воспользуйтесь инструкцией по локальной установке СКИФ и инструкцией по открытию доступа к СКИФ в локальной сети.

    При локальной установке вы теряете преимущества облачного учета.
    Наша рекомендация, если у вас бизнес связанный с торговлей - зарегистрировать сайт, пусть даже сейчас у вас нет возможности им заниматься. Вы сможете вести на сервере хостера учет без сайта и интернет-магазина. А когда-нибудь вы захотите сделать сайт, чтобы увеличить продажи своих товаров и лояльность ваших клиентов, и у вашего домена уже будет определенный возраст, что станет плюсом для продвижения в поисковых системах.
    Если вам потребуется, мы окажем всю необходимую помощь по регистрации сайта и развертыванию на нём системы учета.
  • Как установить систему в подпапку сайта?
    Для установки СКИФ необязательно создавать отдельный домен или поддомен, вы можете установить систему в подпапку вашего сайта. Эту возможность можно использовать для интеграции складского учета с вашим интернет-магазином на другом движке.

    Для установки системы в подпапку, в файле .htaccess в корне установки добавьте имя папки в условие RewriteCond. Например, если вы устанавливаете систему в подпапку /wn/ строка должна иметь вид:
    RewriteCond %{REQUEST_URI} !^/wn/(admin|cabinet|catalog|scif)(/.*|$)
    
    Это всё, далее установка системы в подпапку не отличается от обычной установки, только адрес установки, соответственно, будет с папкой установки /wn/: ваш_домен/wn/admin/?act=install

    После установки, если вы будете использовать наш интернет-магазин, добавьте имя папки без завершающего слеша в константу define('SCIF_CATALOG_DOMEN','/wn'); в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода).

    Вы можете создать неограниченное количество автономных установок системы в разных подпапках на одном сайте. Например, если вы продвигаете франшизу и хотите предоставить своим клиентам готовые интернет-витрины и системы учета на своем сервере.
    Если вы делате несколько автономных установок системы на одном сайте, в файле настроек wn_settings.php в каждой папке задайте собственный префикс для таблиц базы данных в константе WN_PREFIX.
  • Как изменить адрес входа в систему?
    По умолчанию вход в систему учета расположен по адресу /ваш-домен/scif/. Вы можете изменить адрес папки входа или сделать вход в систему с главной страницы домена.
    Для изменения папки входа измените её название, а также значение константы WEBNICE в файле index.php и путь к файлу с паролями в .htaccess
    Если вы хотите входить в систему учета с главной страницы домена, просто скопируйте файл index.php из папки /scif/ в корневую директорию сайта и замените в нём последнюю строку
    require dirname(__DIR__).'/includes/general.php';
    на следующую:
    require 'includes/general.php';
  • Как восстановить забытый пароль?
    Для входа в систему используется два пароля: серверный и пароль учетной записи. Логины и пароли для входа в систему администрирования сайта /admin/ и систему учета /scif/ по умолчанию разные. Для входа в систему администрирования /admin/ серверный логин по умолчанию - admin, логин первой учетной записи - Администратор.
    Для входа в систему учета /scif/ серверный логин по умолчанию - scif, логин первой учетной записи - Директор.

    Если вы забыли серверный пароль, удалите файлы .admpasswd и .htaccess в нужной папке (/admin/ или /scif/), после чего войдите в систему и установите новый пароль через меню "Сервис-Серверный пароль".

    Если вы забыли пароль учетной записи, выполните через phpMyAdmin (есть в дистрибутиве по адресу /admin/phpmyadmin/) следующий SQL-запрос:
    - Для системы администрирования сайта /admin/:
    UPDATE wn_users SET password=MD5("ваш пароль") WHERE id="1";
    - Для системы учета /scif/:
    UPDATE wn_scif1_spr_users SET password=MD5("ваш пароль") WHERE id="1";
  • Сохранение серверного пароля в мобильном браузере
    Для входа в систему учета и раздел администрирования сайта в СКИФ используются два пароля: серверный (технология авторизации веб-сервера Apache) и пользовательский (технология авторизация PHP+MySQL). Первый серверный пароль, при желании, можно отключить, однако делать этого не рекомендуется, т.к. сочетание двух технологий обеспечивает очень высокий уровень защиты. Если неудобно вводить пароль каждый раз, его можно сохранить в браузере, при этом желательно зашифровать сохраненные пароли при помощи функции "мастер-пароля".
    К сожалению, в некоторых мобильных браузерах нельзя сохранить серверный пароль в браузере. Обойти это неудобство можно при помощи передачи пароля через ссылку вида https://login:password@youdomen.ru/scif/
    (замените youdomen.ru на имя вашего домена без https. Если СКИФ установлен в подпапку сайта, она тоже должна быть в адресе: https://login:password@youdomen.ru/wn/scif/)
    Сохраните эту ссылку в избранном браузера. Этот способ подойдет только для случаев, когда доступ к вашему телефону надежно защищен, т.к. в ссылке пароль хранится в открытом виде.
  • Как очистить данные в базе?
    Вы можете полностью очистить данные в базе при помощи набора SQL-запросов. Их можно выполнить через входящий в состав дистрибутива /admin/phpmyadmin/.
    Внимание, приведенные ниже операции очистки таблиц необратимы! Перед их выполнение убедитесь, что у вас есть резервная копия.
    Таблицы в базе имеют определенные связи. Если вам нужно очистить только часть данных, но вы не обладаете достаточными знаниями структуры таблиц, рекомендуем для выполнения данной задачи обратиться к нам, а не выполнять её самостоятельно, т.к. некорректная очистка может привести к ошибкам в функционировании системы.


    Очистка справочников:
    TRUNCATE TABLE `wn_scif1_spr_noms`; # номенклатура
    TRUNCATE TABLE `wn_scif1_spr_noms_gr`;  # группы номенклатуры
    TRUNCATE TABLE `wn_scif1_spr_values`; # значения свойств
    TRUNCATE TABLE `wn_scif1_spr_noms_kit`; # комплекты
    TRUNCATE TABLE `wn_scif1_spr_contrs`; # контрагенты
    
    *группы номенклатуры хранятся в файловом кэше, поэтому даже после очистки таблицы группы они всё еще будут отображаться. Кэш автоматически обновится при создании новой группы или удалите файл кэша вручную по адресу /cache/includes/tree_scif1_spr_noms_gr.inc

    Очистка документов:
    TRUNCATE TABLE `wn_scif1_doc`;
    TRUNCATE TABLE `wn_scif1_doc_history`;
    TRUNCATE TABLE `wn_scif1_fin`;
    TRUNCATE TABLE `wn_scif1_doc_det`;
    TRUNCATE TABLE `wn_scif1_fin_det`;
    UPDATE `wn_scif1_spr_contrs` SET balance="0";
    
    Если вам нужно создать дополнительную базу, а не очищать существующую, используйте меню Сервис-Копирование базы.
  • Работа с мобильных устройств
    СКИФ имеет адаптивную верстку, поэтому в нём можно работать не только с компьютера, но и любого мобильного устройства. Вы также можете установить его на смартфон или планшет как приложение PWA.

    Для решения некоторых задач внесения или получения информации из системы, удобно использовать бота Telegram, вы можете заказать нам его разработку.
  • Переезд на другой хостинг/домен
    Перенос СКИФ на другой хостинг или другой домен в целом не отличаются от переноса любого другого сайта. Если вы обладаете достаточными для этого навыками, можете выполнить перенос самостоятельно. Или закажите перенос нашими силами.
    Инструкция по переносу:
    1. Если вы переносите систему на другой домен, в разделе администрирования CMS /admin/ в меню Сервис-Настройки очистите поле "Адрес сайта". Если домен сайта не меняется, пропускайте данный пункт.
    2. Переносите сайт (копируйте файлы и базу данных).
    3. На новом хостинге измените абсолютные пути в файлах .htaccess в папках /scif/ и /admin/
    4. Если изменились реквизиты подключения к базе данных, задайте новые значения $wn_dbname, $wn_dbuser и $wn_dbpass в файле настроек wn_settings.
    5. Если изменился домен, внесите новый в настройках CMS (см. пункт 1)
    Если перенос происходит из/в подпапку, то дополнительно измените .htaccess как описано здесь. 6. Перенесите задания планировщика CRON и удалите их на старом сайте.

Интеграция с сайтом/интернет-магазином/банком/внешними сервисами

  • Как интегрировать учет с интернет-магазином?
    Выбор способа интеграции зависит от того, какой "движок" интернет-магазина вы будете использовать:

    1. Если у вас еще нет интернет-магазина и вы только выбираете систему, на которой он будет работать, рекомендуем рассмотреть использование нашего движка интернет-магазина, он входит в состав дистрибутива СКИФ. В этом случае, интеграции как таковой не потребуется, так как интернет-магазин и система учета взаимосвязаны и синхронизируются в режиме реального времени по заданным вами настройкам. Подробное описание нашего интернет-магазина и переход к демо доступны ЗДЕСЬ.

    2. Если у вас магазин на OpenCart/ocStore, используйте наш модуль интеграции с Опенкарт. Установка и настройка нашими силами включены в стоимость модуля.

    3. Если ваш интернет-магазин поддерживает обмен данными в формате CommerceML, используйте для интеграции наш модуль обмена, который можно бесплатно скачать на GitHub. CommerceML поддерживают большинство популярных интернет-магазинов либо в составе дистрибутива, либо в виде отдельного модуля.

    Если вам не подходит ни один из перечисленных выше вариантов или требуется их индивидуальная доработка, вы можете реализовать интеграцию собственными силами (используйте описание структуры таблиц СКИФ) или заказать нам (используйте наш бриф в помощь для составления технического задания).
  • Как обрабатываются заказы из интернет-магазина?
    По умолчанию, в системе используется следующая схема обработки заказа. После отправки заказа покупателем с сайта в системе учета создается документ "Заказ покупателя". Этот документ не уменьшает остатки на складе и не увеличивает задолженность контрагента. После получения заказа вы проверяете его и, если всё в порядке, меняете "Вид документа" на "Продажа". При этом изменении товары списываются со склада, а сумма долга покупателя увеличивается.

    Вы также можете задать, чтобы сразу создавался документ "Продажа", а не "Заказ покупателя". Для этого в массиве $wn_catalog_invoice в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) измените значение параметра type с 11 на 2.

    Если критично, чтобы покупатель на сайте мог заказать только количество, имеющееся в наличии, в файле \catalog\тема\includes\acts\order.php раскомментируйте вверху блок кода, который корректирует заказ в соответствии с текущими остатками на складе.
  • Как выводить в магазине не все группы товаров или только товары в наличии?
    Чтобы выводить в интернет-магазине только определенные группы товаров, в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) раскомментируейте константу SCIF_CATALOG_GROUPS и задайте коды нужных групп или любое другое собственное условие.

    Чтобы выводить в интернет-магазине только товары, имеющиеся в наличие на складе, в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) раскомментируейте константу SCIF_CATALOG_STORE и задайте коды нужных складов или любое другое собственное условие.
  • Как добавить к загружаемым изображениям водяной знак?
    В файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) добавьте следующий код (задайте в нем собственные размеры изображения и координаты нанесения):
    function my_image_transform($thumb, $x, $y) {
     if ($x!=WN_IMG_MAX_X_ORIG AND $y!=WN_IMG_MAX_X_ORIG) { return false; } // наносим только на полноразмерное
    $wm=imagecreatefrompng(WN_PATH.'img/watermark.png'); // путь к файлу водяного знака на вашем сервере
    $wm_width=100; // ширина_вод.знака
    $wm_height=70; // высота_вод.знака
    $wn_x=round($x/2-$wm_width/2); // отступ по X (середина)
    $wn_y=round($y-$wm_height-30); // отступ по Y (30px снизу)
    imagecopy($thumb,$wm,$wn_x,$wn_y,0,0,$wm_width,$wm_height);
    }
    
  • Как отслеживать посещаемость и конверсию в интернет-магазине?
    Для мониторинга посещаемости и конверсии мы рекомендуем использовать функционал счетчика Яндекс.Метрика.
    Для этого создайте счетчик, получите код и установите его на сайт из раздела администрирования, меню Сервис-Блоки содержания, поле "Коды счетчиков посещаемости".

    Для отслеживания конверсий, создайте цель с типом Javascript-событие, например, с именем ORDER и добавьте вызов этого события в редактируемый блок "Код отслеживания конверсии":
    <script type="text/javascript">
    window.onload = function() {
    yaCounterXXXXXXX.reachGoal("ORDER");
    };
    </script>
    
    где XXXXXXX - код вашего счетчика. Этот код будет вызываться при отправке заказа в интернет-магазине.
    Если нужна более детальная статистика, в этот же код можно добавить передачу параметров визита.
  • Как подключить платежную систему и онлайн-кассу?
    Вы можете подключить на сайте платежную систему для оплаты заказов вашими покупателями. В составе дистрибутива есть готовые модули для следующих платежных систем и агрегаторов: Яндекс.Касса, Робокасса, WalletOne, Тинькофф.Эквайринг, PayPal. Вы можете добавить другие самостоятельно или заказать нам. Для платежных систем, которые поддерживают передачу данных в онлайн-кассы, можно включить эту опцию и передавать параметры чека.
    Сравнительный обзор платежных систем и инструкция по подключению
  • Как загрузить товары или другой справочник из файла?
    Чтобы не вводить товары и услуги в справочник номенклатуры вручную при начале работы или появлении большого количества новых товаров, вы можете загружать их импортом из Excel. Вы также можете загружать из файла любой другой справочник: контрагентов, пользователей и т.д. Для этого в меню "Справочники-Импорт из Excel" задайте необходимые параметры и выберите загружаемый файл на своем компьютере. Вы можете использовать в файле формулы, а для поля "Описание" можно использовать HTML-теги.
    Пример файла для импорта
  • Как настроить импорт документов из банка?
    Выгрузите из интернет-банка текстовый файл обмена за нужный период, после чего загрузите его в СКИФ из меню Финансы-Импорт банка. Обработка создает ссылки на ввод каждого документа с заполненными значениями даты, суммы, контрагента (по совпадению ИНН) и т.д.
    Вы можете полностью автоматизировать импорт документов, если создадите в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) функцию client_bank(). В эту функцию подаётся массив полей и значений из файла обмена, а на выход нужно отдать массив для создания нужного документа в СКИФ.
    Пример функции client_bank:
    function client_bank($val) { // в массиве $val - значения полей очередной секции из файла обмена
    global $rs; // номер нашего расчетного счета, передаётся из обработки
    $div='';
    $details=$val['НазначениеПлатежа'];
    $det=mb_substr($details,0,27); // начало назначения платежа, будем использовать его для распознавания типа операции
    $note=$val['Номер']; // номер платежа в банке, запишем его в примечание документа
    $type=($val['ПлательщикСчет']!=$rs?1:-1);  // если счет плательщика совпадает с нашим, значит это исходящий платеж
     if ($type<0) { // исходящие платежи
      switch ($det) {
      case "Комиссия за перечисление ср": // комиссия за вывод на карту
      $div.='Комиссия банка:';
      // $data - массив данных для автоматической загрузки в базу:
      // t-тип документа, finitem-статья движения, date-дата документа, org-организация, account-касса/счет,account_to-касса назначения при перемещении,contr-контрагент,manager-ответственный,note-примечание
      $data=array('t'=>24,'finitem'=>0,'date'=>$val['Дата'],'account'=>ACCOUNT,'summa'=>$val['Сумма'],'note'=>'Вывод на карту '.$note);
      // генерируем форму для автоматического создания документа
      $div.=data_item($data);
      break;
      // здесь другие ваши условия
      }
     } else { // входящие платежи
      switch ($det) {
      // по некоторым платежам вы можете создать в СКИФ несколько документов.
      // например, при поступлении средст от платежного агрегатора Робокасса, создаём два документа: перемещение денег на р/с и списание комиссии эквайера
      case 'Перечисление на основ.Заяв.':      // Робокасса
      preg_match('#с учетом взаимозачет комис.Банка \'([\d\.]+)\'\. НДС#u',$details,$items);
      $div.='Робокасса:';
      // документ "Перемещение" со счета "Электронные деньги" на "Расчетный счет"
      $data=array('t'=>29,'finitem'=>0,'date'=>$val['Дата'],'account'=>6,'account_to'=>ACCOUNT,'summa'=>$val['Сумма'],'note'=>$note);
      $div.=data_item($data);
      // документ "Изъятие" - комиссия эквайера со счета "Электронные деньги", статья движения finitem - Комиссия
      $data=array('t'=>24,'finitem'=>3,'date'=>$val['Дата'],'account'=>6,'summa'=>$items[1],'note'=>$note);
      $div.=data_item($data);
      break;
      // здесь другие ваши условия
      }
     }
    return $div;
    }
    Вы также можете заказать создание такой функции нам.
  • Личный кабинет клиента/поставщика
    Дистрибутив СКИФ вместе с системой учета, сайтом и интернет-магазином, содержит также функционал "Личного кабинета". Вы можете использовать его для предоставления доступа к определенной ограниченной информации из системы учета вашим клиентам, поставщикам, партнерам, курьерам и т.п. Например, покупатели могут получить информацию о своих накладных и задолженности. Поставщики - доступ к информации об остатках своей продукции и т.д.
    Пароль доступа в личный кабинет устанавливается в карточке контрагента (затем пользователь может самостоятельно его сменить). Логином по умолчанию является код контрагента, вы также можете использовать email или другое уникальное поле. Для использования в качестве логина Email, измените значение константы WN_CABINET_LOGIN с "id" на "email" и задайте полю email значение уникальности в таблице spr_contrs.
    Личный кабинет находится по адресу /cabinet/
  • Данные для бухгалтерской и налоговой отчетности
    СКИФ предназначен для ведения управленческого учета, вместе с тем, вы можете получить в нем все необходимые данные для бухгалтерской и налоговой отчетности.
    Если вы на УСН, получить данные по обороту можно в меню Отчеты-Торговля-Продажи.
    Если вы являетесь плательщиком НДС, в СКИФ можно формировать книги покупок и продаж.
    Из СКИФ также можно выгружать данные в 1С:Бухгалтерию с фильтрами по организациям, складам, статьям движения и др.

Доработки программы

  • Как изменить внешний вид программы учета?
    Вы можете легко менять внешний вид программы под собственный вкус. Для этого просто внесите необходимые изменения в файл таблицы стилей /scif/style.css самостоятельно или закажите эту работу нам.
    Оформление по умолчанию:
    Пример 1. Меню слева:
    Пример 2. Собственное оформление и иконки:
    Пример 3. Ночная тема:
  • Как создать собственную тему оформления сайта и интернет-магазина?
    В комплекте дистрибутива идут пять тем оформления, вы можете посмотреть их в работе, переключившись на нужную по скриншотам с главной страницы демо-сайта. Простой путь создания уникального внешнего вида сайта - просто выбрать одну из этих тем и внести в неё необходимые изменения (заменить логотип, цветовое оформление в файлах стилей и т.п.).
    Вы также можете создать собственную тему оформления. Для этого создайте новую папку, например, /themes/my/, скопируйте в неё файлы из другой темы, которую будете видоизменять, например, /themes/default/ (если используете интернет-магазин, то так же из /catalog/default/ в /catalog/my/). Затем внесите нужные изменения и смените тему оформления в панели администрирования через меню Сервис-Настройки в поле "Тема оформления".
  • Как добавить собственную печатную форму?
    Вы можете самостоятельно редактировать и создавать новые печатные формы или заказать эту работу нам. Шаблоны печатных форм и скрипты, их заполняющие, находятся в папке /scif/includes/printforms/. Рекомендуется не изменять печатные формы дистрибутива, а создавать их копии, чтобы нечаянно не потерять изменения при обновлении системы.
    Например, шаблон счет-фактуры находится в файле 8.xls, а формирующий скрипт в файле 8.php. Если вы хотите изменить счет-фактуру или создать новый документ, похожий на счет-фактуру, проделайте следующее:
    - скопируйте файлы 8.xls и 8.php в файлы 1008.xls и 1008.php в той же папке /scif/includes/printforms/
    - внесите нужные вам изменения в новые файлы
    - в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) добавьте следующую строку:
    $scif_printforms['1008']=array('name'=>'Моя счет-фактура','desc'=>'Моя счет-фактура с печатью','cat'=>'store');
    Таким образом, у Вас получится два варианта счет-фактуры в списке "Печать". Если дистрибутивный вариант вам не нужен, добавьте также следующую строку:
    @unset($scif_printforms[8]);

    Если печатную форму нужно печатать из браузера, добавьте в массив параметр 'newwin'=>true, она будет открываться в отдельной вкладке браузера.
  • Как настроить вид ценников/этикеток?
    Вы можете редактировать существующие и создавать новые шаблоны ценников/этикеток самостоятельно или заказать эту работу нам. Можно удалять ненужные вам шаблоны, добавлять свои, менять последовательность, редактировать вид, размеры, ориентацию, выводимую информацию, формат штрихкода в др., в общем, полностью настроить печать ценников так, как вам нужно.
    Дистрибутивные шаблоны ценников находятся в файле /scif/includes/printforms/pricelabels.php, скрипт имеет открытый исходный код. Если вы хотите отредактировать ценники, создайте копию указанного файла в той же папке с именем my_pricelabels.php и уже в копии вносите свои изменения. Система автоматически обнаружит созданную пользовательскую копию с именем my_pricelabels.php. Не вносите изменения в оригинальном файле pricelabels.php, чтобы не потерять изменения при обновлении системы!

    Если вы хотите иметь возможность редактировать макеты ценников через меню Сервис-Редактор кода, добавьте в файле настроек следующий код:
    // дополнительные скрипты для редактирования через редактор
    $ext_editor_scripts_scif=array(
    'my_pricelabels'=>array('name'=>'Ценники','path'=>'scif/includes/printforms','note'=>'Шаблоны ценников')
    );
    
  • Как разрешить неограниченный уровень вложенности в справочниках?
    По умолчанию, в СКИФ используются только два уровня вложенности групп в справочниках. Если вам требуется больше, добавьте в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) следующую строку:
    $sprs[N]['multilevel']=true;
    где N - ID нужного справочника.
    Например, для справочника номенклатуры:
    $sprs[5]['multilevel']=true;
    Для справочника контрагентов:
    $sprs[6]['multilevel']=true;
  • Как добавить собственные поля в справочники?
    Вы можете самостоятельно добавлять новые поля в любые справочники и группы справочников. Для этого нужно выполнить 2 простых действия:
    1. Добавить поле нужного формата в соответствующую таблицу базы данных. Это можно сделать через входящий в комплект дистрибутива /admin/phpmyadmin/. Имя нужной таблицы можно узнать здесь.
    2. Добавить описание поля в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода).

    Пример 1. Добавим товару текстовое поле "Ключевые слова" для вывода на странице в интернет-магазине. Для этого:
    1. В таблицу справочника номенклатуры wn_scif1_spr_noms добавим строковое поле meta_keywords
    2. В файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) добавим следующий код:
    $sprs[5]['userfields']['meta_keywords']=array('name'=>'Ключевые слова','type'=>'text','size'=>60,'maxlength'=>255);
    Где 5 - это код справочника номенклатуры. Код нужного справочника можно посмотреть в массиве $sprs в файле /scif/index.php

    Всё. После этого на странице редактирования товара внизу появится новое поле.

    Для вывода этого поля на странице товаров в каталоге нужно внести изменения в файл /catalog/includes/acts/product.php:
    1. Добавляем поле в sql-запрос:
    $product_data=$db->sql_fetch_assoc($db->sql_query("SELECT... здесь добавим в перечисление нужное нам поле
    2. Ниже делаем добавление этого поля в переменную $meta, если поле заполнено:
    if (!empty($product_data["meta_keywords"])) {
    $meta='<meta name="Keywords" content="'.$product_data["meta_keywords"].'">';
    }

    Для добавления поля группе справочника используйте поле userfields_gr, например, $sprs[5]['userfields_gr']


    Пример 2. Добавим в карточку сотрудника привязку к складам/торговым точкам, при этом одного сотрудника нужно иметь возможность связать сразу с несколькими складами.
    Для вывода поля редактирования вызывается функция edit_field(), а для обработки поля функция process_field(), которые находятся в файле /includes/functions.php. Если в параметре массива указать значения my_edit_field и my_process_field, можно задать обработку в собственных функциях. Для нашей задачи нужно выполнить следующее:
    1. В таблицу пользователей wn_scif1_spr_users добавим текстовое поле stores
    2. В файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) добавим следующий код:
    $sprs[2]['userfields']['stores']=array('name'=>'Склады','my_edit_field'=>'stores','my_process_field'=>'stores');
    function my_edit_field($key,$val,$cur_val='') {
    global $stores;
    $return='';
     switch ($val['my_edit_field']) {
     case 'stores':
     $arr=(!empty($cur_val)?explode(',',$cur_val):array());
      foreach ($stores AS $k=>$v) {
      $return.='<label><input type="checkbox" name="stores[]" value="'.$k.'"'.(in_array($k,$arr)?' checked':'').'>-'.$v['name'].'</label><br>';
      }
     break;
     }
    return $return;
    }
    function my_process_field($key,$val,$cur_val='') {
     switch ($val['my_process_field']) {
     case 'stores':
     $return=((!empty($_POST[$key]) AND count($_POST[$key]))?implode(',',$_POST[$key]):'');
     break;
     }
    return $return;
    }
    
    Всё. После этого в карточке пользователя появятся чекбоксы с названиями складов.

    Пример 3. Добавим товару галочки и поле "Старая цена" для вывода отмеченных товаров на главной странице сайта в темах Electro и Mobiles. Для этого:
    1. Добавим нужные поля в таблицу товаров:
    ALTER TABLE `wn_scif1_spr_noms`
    ADD `my_frontpage_new` TINYINT UNSIGNED NOT NULL DEFAULT "0",
    ADD `my_frontpage_actions` TINYINT UNSIGNED NOT NULL DEFAULT "0",
    ADD `my_frontpage_offer` TINYINT UNSIGNED NOT NULL DEFAULT "0",
    ADD `my_frontpage_price` DECIMAL( 10, 2 ) UNSIGNED NOT NULL DEFAULT "0.00",
    ADD `my_frontpage` TINYINT UNSIGNED NOT NULL DEFAULT "0",
    ADD INDEX ( `my_frontpage` );
    
    Обратите внимание, что здесь мы добавляем на одно поле больше, чем количество галочек. Это индексируемое поле my_frontpage, в него бы будем записывать 1, если отмечена хотя бы одна галочка, чтобы извлекать все нужные для отображения на главной странице товары одним запросом, а не несколькими.
    2. Добавим массив и код обработки полей в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода):
    $sprs[5]['userfields']['my_frontpage']=array('name'=>'Вывод на сайте:','my_edit_field'=>'my_frontpage','my_process_field'=>'my_frontpage');
    function my_edit_field($key,$val,$cur_val='') {
    global $row;
    $return='';
     switch ($val['my_edit_field']) {
     case 'my_frontpage':
     $return.='<input type="hidden" name="my_frontpage">
     Выводить товар на главной сайта в отмеченных блоках:
     <div class="margin">
     <label><input type="checkbox" name="my_frontpage_new" value="1"'.(!empty($row['my_frontpage_new'])?' checked':'').'> - Новинки</label>;&nbsp;
     <label><input type="checkbox" name="my_frontpage_actions" value="1"'.(!empty($row['my_frontpage_actions'])?' checked':'').'> - Акции</label>;&nbsp;
     <label><input type="checkbox" name="my_frontpage_offer" value="1"'.(!empty($row['my_frontpage_offer'])?' checked':'').'> - Спецпредложения</label>.
     </div>
     Старая цена: <input type="text" name="my_frontpage_price" class="numeric" type="text" maxlength="9"
     value="'.(!empty($row['my_frontpage_price'])?(float)$row['my_frontpage_price']:'').'"> - <i>если указана, будет выводиться перечеркнутой в блоках Акции и Спецпредложения</i>';
     break;
     }
    return $return;
    }
    function my_process_field($key,$val,$cur_val='') {
    global $row_new;
     switch ($val['my_process_field']) {
     case 'my_frontpage':
     $row_new['my_frontpage_new']=(!empty($_POST['my_frontpage_new'])?1:0);
     $row_new['my_frontpage_actions']=(!empty($_POST['my_frontpage_actions'])?1:0);
     $row_new['my_frontpage_offer']=(!empty($_POST['my_frontpage_offer'])?1:0);
     $row_new['my_frontpage_price']=(!empty($_POST['my_frontpage_price'])?floatval(str_replace(',','.',$_POST['my_frontpage_price'])):0);
     $return=(($row_new['my_frontpage_new'] OR $row_new['my_frontpage_actions'] OR $row_new['my_frontpage_offer'])?1:0);
     break;
     }
    return $return;
    }
    
    Это всё. Теперь в карточке товара появятся нужные галочки. Пример получения этих товаров из базы данных и вывода на странице есть в файле \themes\electro\includes\acts\frontpage.php
  • Как добавить собственные поля в документы?
    Вы можете самостоятельно добавлять новые поля в документы. Для этого нужно выполнить 2 простых действия:
    1. Добавить поле нужного формата в соответствующую таблицу базы данных:
    - wn_scifN_doc - для добавления поля в складские документы (и wn_scifN_doc_history для хранения истории изменений складских документов)
    - wn_scifN_fin - для добавления поля в финансовые документы
    где N - индекс базы
    Добавить поле можно через входящий в комплект дистрибутива /admin/phpmyadmin/.
    2. Добавить описание поля в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода):
    - в переменную $docs_cat['store']['userfields'] - для складских документов
    - в переменную $docs_cat['fin']['userfields'] - для финансовых документов


    Пример 1. Добавим в складские документы поле "Описание" для многострочного ввода текста. Например, вы можете его использовать, если нужно делать объемные примечания к документам. Массив, который нужно добавить в wn_settings.php будет иметь следующий вид:
    $docs_cat['store']['userfields']['ext_note']=array('name'=>'Описание','type'=>'textarea');
    Всё. После этого на странице создания/редактирования складского документа появится новое поле.

    Для вывода редактирования поля вызывается функция edit_field(), а для обработки поля функция process_field(), которые находятся в файле /includes/functions.php. Если в параметре массива указать значения my_edit_field и my_process_field, можно задать обработку в собственных функциях. При помощи собственных обработчиков вы можете реализовать более сложные варианты.

    Пример 2. Добавим в складской документ поле "Отсрочка", для которого нам нужно ограничить формат ввода только двумя цифрами и которое при изменении будет проставлять рассчитанную дату в поле "Срок оплаты".
    Для добавления данного поля нужно выполнить следующее:
    1. В таблицу документов wn_scif1_doc добавим поле delay в формате TINYINT
    2. В файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) добавим следующий код:
    $docs_cat['store']['userfields']['delay']=array('name'=>'Отсрочка','format'=>'intval','my_edit_field'=>'delay');
    
    function my_edit_field($key,$val,$cur_val='') {
    global $row;
    $return='';
     switch ($val['my_edit_field']) {
     case 'delay':
     $return='<input type="text" value="'.$cur_val.'" id="delay" name="delay" size="2" maxlength="2" pattern="\d{,2}" title="Не более 2-х цифр" onchange="change_term(this.value)"> дн.
      <script type="text/javascript">
      function change_term(day) {
      var diff=parseInt(day)+1;
      var calcDate = new Date($("#date").datepicker("getDate"));
      calcDate.setDate(calcDate.getDate()+diff);
      $("#payment_term").datepicker("setDate", calcDate);
      }
      </script>';
     }
    return $return;
    }
    


    Пример 3. Добавим в финансовые документы поле "Период", состоящее из года и месяца, при этом на странице редактирования они будут выводиться как два отдельных поля "Месяц" и "Год". Такое поле может быть востребовано для финансового планирования и аналитики, когда какие-то затраты требуется отнести не на тот период, в котором был расход денег.
    Для добавления данного поля нужно выполнить следующее:
    1. В таблицу документов wn_scif1_fin добавим поле period в формате MEDIUMINT
    2. В файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) добавим следующий код:
    $docs_cat['fin']['userfields']['period']=array('name'=>'Отчет.период','my_edit_field'=>'period','my_process_field'=>'period');
    function my_edit_field($key,$val,$cur_val='') {
    global $row;
    $return='';
    switch ($val['my_edit_field']) {
    case 'period':
    $months=array(1=>'январь',2=>'февраль',3=>'март',4=>'апрель',5=>'май',6=>'июнь',7=>'июль',8=>'август',9=>'сентябрь',10=>'октябрь',11=>'ноябрь',12=>'декабрь');
    if ($cur_val) {
    $month=intval(substr($cur_val,-2));
    $year=intval(substr($cur_val,0,4));
    } else {
    $month=date('n');
    $year=date('Y');
    }
    // добавим пустое скрытое поле, чтобы избежать Notice при обработке
    $return.='<input type="hidden" name="period">
    <select name="month">';
    foreach ($months AS $key=>$val) {
    $return.='<option value="'.$key.'"'.($key==$month?' selected':'').'>'.$val.'</option>';
    }
    $return.='</select>
    <input type="text" value="'.$year.'" name="year" size="3" maxlength="4" pattern="\d{4}" title="Четыре цифры года"> г.';
    }
    return $return;
    }
    function my_process_field($key,$val,$cur_val='') {
    switch ($val['my_process_field']) {
    case 'period':
    $return=intval($_POST['year']).str_pad(intval($_POST['month']),2,0,STR_PAD_LEFT);
    break;
    }
    return $return;
    }
    
    Всё. После этого в финансовых документах появится возможность указания периода.
  • Как добавить собственные поля в табличную часть документа?
    Вы можете самостоятельно добавлять новые поля в табличную часть складского документа. Для этого добавьте поле в структуру таблицы wn_scifN_doc_det и опишите его в массиве $docitem_userfields в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода).
    Пример. Нам нужно в печатной форме коммерческого предложения выводить дату ожидаемого поступления на склад по каждой позиции. Для этого:
    1. Добавим поле в таблицу:
    ALTER TABLE `wn_scif1_doc_det` ADD `my_arrival_date` DATE NULL DEFAULT NULL;
    
    2. Добавим в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) следующую строку:
    $docitem_userfields['my_arrival_date']=array('name'=>'Дата поступления','type'=>'date_sql','format'=>'date_sql','append_row'=>'$(new_row).find("input.datepicker").datepicker();');
    
    В переменную "name" после названия можно добавить JavaScript, который будет выполнять при открытии документа. А в переменной "append_row" можно задать JavaScript, который будет выполнять каждый раз при добавлении в табличную часть новой строки. В нашем примере мы преобразуем поле даты в календарь.
    Так же, как и для пользовательских полей в справочнике и документах, в пользовательских полях табличной части вы можете описать собственные функции для вывода и обработки добавляемых полей. Для этого укажите эти функции в переменных "my_edit_field" и "my_process_field".
    Возможно реализовать любые требующие вам возможности, напишите нам для получения консультации по оптимальнму решению ваших задач.
  • Как сделать поле Примечание многострочным?
    По умолчанию, в поле "Примечание" в документе можно ввести одну строку длиной до 255 символов. Если вам нужно вносить более длинные тексты в примечание или использовать переносы строк, вы можете сделать это поле многострочным. Для этого:
    Для складских документов:
    1. Преобразуйте поле note в базе данных из VARCHAR в TEXT при помощи следующего SQL-запроса (это можно сделать через входящий в комплект дистрибутива /admin/phpmyadmin/)
    ALTER TABLE `wn_scif1_doc` CHANGE `note` `note` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT "";
    2. Добавьте в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) следующие строки:
    // Многострочное поле Примечание
    $docs_cat['store']['fields']['note']['type']='textarea';
    $docs_cat['store']['fields']['note']['rows']=2; // количество строк в поле (по умолчанию, если не задано, 2)
    

    Для финансовых документов:
    ALTER TABLE `wn_scif1_fin` CHANGE `note` `note` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT "";
    // Многострочное поле Примечание
    $docs_cat['fin']['fields']['note']['type']='textarea';
    $docs_cat['fin']['fields']['note']['rows']=2; // количество строк в поле (по умолчанию, если не задано, 2)
    
  • Как прикреплять файлы/картинки к справочнику, документу или задаче?
    Вы можете использовать готовый модуль или создать пользовательский код по примеру ниже для прикрепления изображений или файлов разрешенных вами форматов к документам, справочникам или задачам. Для этого:

    1. Добавьте поле типа TEXT в нужную таблицу базы данных: `tasks` - задачи, `doc` - складские документы, `fin` - финансовые документы, `spr_contrs` - контрагенты, `spr_noms` - номеклатура и т.д. (см. описание таблиц СКИФ). Например, мы хотим прикреплять файлы в карточке товара, для этого добавим поле `my_files` в таблицу справочника номенклатуры при помощи следующего SQL-запроса:
    ALTER TABLE `wn_scif1_spr_noms` ADD `my_files` TEXT NOT NULL DEFAULT '';

    2. Добавьте описание поля в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода):
    $tasks_userfields - задачи, $docs_cat['store']['userfields'] - складские документы, $docs_cat['fin']['userfields'] - финансовые документы, $sprs[N]['userfields'] - справочник, где N - код нужного справочника. В массиве укажите в какой папке будут храниться файлы от корня системы (переменная path) и какие форматы файлов будут разрешены в загрузке (массив formats). Обязательно указывайте, какие форматы разрешены к загрузке, исключать эту проверку небезопасно!
    Если файлы предназначаются только для внутреннего использования, лучше создать подпапку в папке /scif/, например, "scif/files/", она будет защищена серверным паролем. Если нужен публичный доступ к файлам, например, это изображения товара, нужно указать папку, доступную на сайте.

    Пример. Нам нужно загружать дополнительные изображения к товарам, при этом мы будем сохранять имена загружаемых файлов, чтобы выводить их в каталоге в полях "Alt" и "Title" для лучшей индексации поисковыми системами.
    Добавляем в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) следующий код:
    $sprs[5]['userfields']['my_files']=array('name'=>'Доп.картинки:', 'my_edit_field'=>'my_files', 'my_process_field'=>'my_files',
    'params'=>array('fieldname'=>'my_files',
     'path'=>'img/'.SCIF_CATALOG_BASE.'_add/spr_noms/', // путь сохранения
     'enableformats'=>'jpg,jpeg,png,gif', // разрешенные форматы
     'files_count'=>false, // сохранять количество загруженных файлов (нужно создать поле в таблице)
     'save_name'=>true // сохранять оригинальное имя загружаемого файла для тега ALT
    ));
    function my_edit_field($key,$val,$cur_val='') {
    global $db, $v, $repl, $row, $table, $act;
    $return='';
     switch ($val['my_edit_field']) {
     case 'my_files':
      if ($v AND !$repl) {
      $fieldname=$val['params']['fieldname'];
      $return.='<input type="file" name="'.$fieldname.'" accept=".'.str_replace(',',',.',$val['params']['enableformats']).'"> Разрешенные форматы: '.$val['params']['enableformats'];
       if (!empty($row[$fieldname])) {
       $folder=$val['params']['path'].floor($v/1000).'/'.$v.'/';
       $return.='<br><br><b>Загружены ранее</b>:<br>';
       $arr=unserialize(stripslashes($row[$fieldname]));
        if (!empty($_GET['delfile'])) { // удаляем файл
        $key=htmlclean($_GET['delfile']);
         if (isset($arr[$key])) {
         $return.='Файл '.$key.' удален<br>';
         unset($arr[$key]);
          if (file_exists(WN_PATH.$folder.$key)) { unlink(WN_PATH.$folder.$key); }
         $db->sql_query('UPDATE `'.SCIF_PREFIX.$table.'` SET `'.$fieldname.'`="'.(count($arr)?addslashes(serialize($arr)):'').'" WHERE `id`="'.$v.'"');
         }
        }
        foreach ($arr AS $fk=>$fv) {
        $return.=' <a href="'.WN_HOME.$folder.$fk.'" target="_blank">'.$fv['n'].'</a> <a href="?act='.$act.(!empty($_GET['t'])?'&amp;t='.intval($_GET['t']):'').'&amp;v='.$v.'&amp;delfile='.$fk.'" style="color:red" onclick="return del()" title="Удалить выбранный файл">x</a><br>';    }
       }
      }
     break;
     }
    return $return;
    }
    
    function my_process_field($key,$val,$cur_val='') {
    global $row, $v, $upload_file, $userdata;
     switch ($val['my_process_field']) {
     case 'my_files':
     $fieldname=$val['params']['fieldname'];
     $my_files=(!empty($row[$fieldname])?$row[$fieldname]:''); // при создании нового товара поля еще нет
     $val['params']['path'].=floor($v/1000).'/'.$v.'/';
      if (!empty($_FILES[$fieldname]['size']) AND upload_file($val['params'])) { // загрузка файла, делаем проверку FILES, чтобы не загрузился из логотипа по URL
      $type=substr(strrchr($upload_file['file'],'.'),1); // исходное расширение файла
      $newkey=$v.'_'.$userdata['id'].'_'.date('YmdHis').'_'.explode('.',microtime(true))[1].'.'.$type;
       if (rename(WN_PATH.$upload_file['file'],WN_PATH.$val['params']['path'].$newkey)) {
       $name=$upload_file['name'];
       echo '<div class="panel_top">Файл <a href="'.WN_HOME.$val['params']['path'].$newkey.'" target="_blank">'.$name.'</a> успешно загружен!</div>';
       $arr=unserialize($my_files);
       $arr[$newkey]=array('n'=>$name);
       $my_files=serialize($arr);
       } else {
       echo 'Не удалось переименовать файл!';
       }
      }
     $return=addslashes($my_files);
     break;
     }
    return $return;
    }
    
    Это всё, теперь в карточке товара появится внизу поле "Файлы" и можно будет добавлять новые файлы. Закомментированный пример вывода этих изображений в карточке товаров есть в файле /catalog/тема/includes/acts/product.php
  • Как добавить собственный отчет?
    Вы можете самостоятельно создавать новые отчеты или заказать эту работу нам. Отчеты находятся в папке /scif/includes/reports/. Рекомендуется не заменять отчеты из дистрибутива, а создавать новые с индексом от 1000, чтобы нечаянно не потерять изменения при обновлении системы.
    Для образца создания отчета вы можете использовать скрипт с открытым исходным кодом reports/22.php, в котором продемострировано создание отчета на примере расчета заработной платы. Если вы хотите создать собственный отчет по зарплате, проделайте следующее:
    - скопируйте файл 22.php в файл 1000.php в той же папке /scif/includes/reports/
    - внесите нужные вам изменения в новый файл
    - в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) добавьте следующие строки:
    if (isset($scif_reps)) {
    unset($scif_reps[22]);
    $scif_reps[1000]=array('name'=>'Зарплата','desc'=>'Расчет зарплаты','submenu'=>4);
    }
    
    Вы также можете приобрести отчеты с открытым исходным кодом (с возможностью самостоятельно вносить в них нужные вам изменения) в нашем каталоге расширений.
  • Как добавить собственный модуль?
    Вы можете расширять функциональность системы, самостоятельно создавая новые модули или заказывать эту работу нам. Модули находятся в папке /scif/includes/acts/. Рекомендуется не заменять модули из дистрибутива, а создавать новые с собственными именами, чтобы не потерять изменения при обновлении системы.
    В качестве образца вы можете использовать скрипт с открытым исходным кодом acts/mail.php или модуль "Список дел" на GitHub. Для создания собственного модуля просто разместите скрипт с нужным функционалом в папке /scif/includes/acts/, например, my_module.php. После этого вы можете обращаться к нему по адресу ?act=my_module. Вы можете добавить ссылки на него в блоки "Объявление", "Заметки" или меню на главной странице системы или в меню "Действия"
    Для добавления ссылки на модуль в меню "Сервис", в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) добавьте строку:
    $scif_actions['1000']=array('name'=>'Название','desc'=>'Описание','menu'=>7,'file'=>'my_module');
    
  • Как добавить собственные фильтры в справочниках?
    Вы можете добавлять в любой справочник собственные поля и условия для фильтрации.
    Пример 1. Поиск контрагентов по адресу email. Для этого в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) добавьте строку:
    $sprs[6]['filter_fields']['email']=array('name'=>'E-mail');
    
    Это всё. В справочнике контрагентов в блоке "Фильтр" появится поле "E-mail". По умолчанию поиск нестрогий, т.е. ведется по вхождению указанной строки (LIKE "%условие%"). Например, поиск "company" найдет контрагентов с адресами moscow@company.ru, piter@company.com и т.д. Для использования строгого поиска, добавьте в массив параметр 'strong'=>true
    Вы также можете создавать собственные условия для поиска. Для этого укажите в массиве параметр 'func'=>true и добавьте в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) функцию my_filter_fields с нужным вам условием.
    Пример 2. Отбор клиентов по дате последнего контакта, чтобы находить тех, кто про нас забыл или, наоборот, тех, с кем сейчас ведём общение. Ниже пример фильтра для отбора клиентов, дата последнего контакта с которыми была не позднее заданного количества дней:
    $sprs[6]['filter_fields']['date_contact']=array('name'=>'Контакт за N дн.','func'=>true);
    function my_filter_fields($t,$field,$filter) {
     switch ($t) {
     case 6: // контрагенты
      switch ($field) {
      case 'date_contact':
      return 's.date_contact>"'.(time()-intval($filter)*24*60*60).'"';
      }
     }
    }
    
    Если вы ведете общение с клиентами по email, в файле /cron/reminders.php есть пример, как автоматически обновлять дату контакта с контрагентом при появлении письма с его адресом во Входящих или Отправленных.
  • Как настроить список справочника?
    Вы можете добавлять/изменять/удалять колонки в любом справочнике и менять их оформление, в том числе в зависимости от значений в строке. Данная возможность реализована следующим образом. Скрипт помещает все ячейки строки таблицы в массив $cells (нумерация с нуля) и перед выводом передаёт его на обработку пользовательской функции my_sprlist(), если это задано в массиве $sprs[$t]['my_sprlist'], где $t-индекс справочника. В массиве my_sprlist задается что обрабатывается: head - заголовок таблицы, sql - SQL-запрос поиска по справочнику, row - строка данных таблицы, search - SQL-запрос поиска товаров для подбора в документ.

    Пример 1. В списке контрагентов сделаем все телефоны кликабельными ссылками. Здесь мы будем использовать регулярные выражения, чтобы обработать телефоны в независимости от формата их написания: с пробелами, скобками и дефисами. Добавьте в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) следующий код:
    $sprs[6]['my_sprlist']=array('row'=>1);
    function my_sprlist($type) {
    global $t, $cells;
     switch ($t) {
     case 6: // контрагенты
      switch ($type) {
      case 'row':
      $cells[2]=preg_replace_callback('#(\d+[\d \(\)\-]{8,15}\d+)#si', function ($matches) { return '<a href="tel:'.preg_replace('#[^\d]+#','',$matches[0]).'">'.$matches[1].'</a>'; }, $cells[2]);
      break;
      }
     break;
     }
    }
    

    Пример 2. В справочнике контрагентов мы хотим добавить кликабельное поле email, а также значение свойства "Статус" (будем дополнительно подключать таблицу spr_values). При этом выделим цветом колонки с кодом статуса равным 1. Добавьте в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) следующий код:
    $sprs[6]['my_sprlist']=array('head'=>1,'sql'=>1,'row'=>1);
    function my_sprlist($type) {
    global $t, $row, $sqls, $cells;
     switch ($t) {
     case 6: // контрагенты
      switch ($type) {
      case 'head':
      $cells[1].='<th>Email</th><th>Статус</th>';
      break;
      case 'sql':
      $sqls['select'].=', s.email, s.property4, v.name AS status_name';
      $sqls['from'].=' LEFT JOIN '.SCIF_PREFIX.'spr_values v ON s.property4=v.id';
      break;
      case 'row':
      $cells[1].='<td>'.($row['email']?'<a href="mailto:'.$row['email'].'" target="_blank">'.$row['email'].'</a>':'&nbsp;').'</td>
      <td'.($row['property4']==1?' style="background-color:red"':'').'>'.($row['status_name']?$row['status_name']:'&nbsp;').'</td>';
      break;
      }
     break;
     }
    }
    

    Пример 3. В справочник номенклатуры добавим колонку "Артикул". Здесь нужно обратить внимание, что номер колонки будет отличаться при просмотре справочника и при подборе товаров в документ. Добавьте в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) следующий код:
    $sprs[5]['my_sprlist']=array('head'=>1,'sql'=>1,'row'=>1);
    function my_sprlist($type) {
    global $t, $m, $row, $sqls, $cells;
     switch ($t) {
     case 5: // номенклатура
      switch ($type) {
      case 'head':
      // в форме подбора в документ добавляем Артикул ко второй колонке (после Упаковки), в справочнике - к первой (после Названия)
       if ($m==1) {
       $cells[2].='<th>Артикул</th>';
       } else {
       $cells[1].='<th rowspan="2">Артикул</th>';
       }
      break;
      case 'sql':
      $sqls['select'].=', s.vendorcode';
      break;
      case 'row':
      $index=($m==1?2:1);
      $cells[$index].='<td>'.($row['vendorcode']?$row['vendorcode']:'&nbsp;').'</td>';
      break;
      }
     break;
     }
    }
    
  • Как изменить вывод количества элементов в справочнике?
    По умолчанию, при просмотре группы справочника отображаются первые 100 входящих в неё элементов. Количество влияет на скорость отображения страницы, чем меньше, тем загрузка быстрее. Если в какой-то группе больше 100 элементов, вы можете найти нужные поиском по фильтру или нажав галочку "показать все" внизу страницы. При необходимости, вы можете изменить значение параметра в меню Сервис-Настройки.
  • Как настроить журнал документов?
    Вы можете добавлять/изменять/удалять колонки в журнале документов и менять их оформление, в том числе в зависимости от значений в строке.

    Добавление/изменение/удаление колонок:
    Данная возможность реализована следующим образом. Скрипт журнала помещает все ячейки строки таблицы в массив $cells (нумерация с нуля) и перед выводом передаёт его на обработку пользовательской функции, если это задано в массиве $scif_actions. Возможность доступна в следующих журналах:
    - Журнал финансовых документов: функция - my_finlist(), индекс $scif_actions[6]
    - Журнал складских документов: функция - my_doclist(), индекс $scif_actions[3]
    - Cписок задач: функция - my_tasklist(), индекс $scif_actions[16]s
    В массиве $scif_actions задается что обрабатывается: head - заголовок таблицы, filters - строка фильтров, sql - SQL-запрос к базе данных, row - строка данных таблицы, foot - строка итогов.

    Пример 1. Удалим колонку "Организация" в журнале финансовых документов.
    Для этого добавьте в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) следующий код:
    $scif_actions[6]['my_finlist']=array('head'=>1,'filters'=>1,'sql'=>0,'row'=>1,'foot'=>1);
    function my_finlist($type) {
    global $cells;
    unset($cells[7]);
    }
    

    Пример 2. Добавим в журнале складских документов колонку с кодом заказа из интернет-магазина OpenCart с возможностью поиска по нему.
    $scif_actions[3]['my_doclist']=array('head'=>1,'filters'=>1,'sql'=>1,'row'=>1,'foot'=>1);
    function my_doclist($type) {
    global $cells, $sqls, $row;
     switch ($type) {
     case 'head': // заголовок
     $cells[0].='<th data-sorter="digit">OpenCart</th>';
     break;
     case 'filters': // строка фильтров
     $cells[0].='<td><input id="f_shop_id" size="5" style="width:45px" maxlength="8" name="f_shop_id" type="text" value="'.(!empty($_REQUEST['f_shop_id'])?intval($_REQUEST['f_shop_id']):'').'" onchange="items(0)"></td></td>';
     break;
     case 'sql': // SQL-запрос (здесь добавляем условие поиска по заданному коду)
      if (!empty($_REQUEST['f_shop_id'])) {
      $sqls['where'].=($sqls['where']?' AND ':'').'d.shop_id="'.intval($_REQUEST['f_shop_id']).'"';
      }
     break;
     case 'row': // строка таблицы
     $cells[0].='<td>'.($row['shop_id']?$row['shop_id']:'&nbsp;').'</td>';
     break;
     case 'foot': // итоги в подвале
     $cells[0].='<td>&nbsp;</td>';
     break;
     }
    }
    function scif_meta() {
    global $act, $meta;
     // мы добавили еще одну колонку в начало таблицы и потому нужно сдвинуть номер колонки для подсветки Долга с 9 на 10
     if ($act=='doclist') {
     $meta.='<style type="text/css">tr.debt td:nth-child(9) { color:inherit } tr.debt td:nth-child(10) { color:red }</style>';
     }
    }
    

    Пример 3. Поменяем в списке задач местами третью и четвертую колонки.
    $scif_actions[16]['my_tasklist']=array('head'=>1,'filters'=>1,'sql'=>0,'row'=>1,'foot'=>1);
    function my_tasklist($type) {
    global $cells;
    list($cells[2], $cells[3]) = array($cells[3], $cells[2]);
    }
    

    Изменение оформления колонки в зависимости от значения в строке:
    Например:
    - подсветить красным документы, по которым есть просроченный долг
    - раскрасить разными цветами документы с разными статусами
    - выделить документы, в которых пользователь назначен ответственным
    и т.д.
    Для этого создайте в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) функцию tuning_journals_rows(), примеры реализации есть в файле /scif/includes/functions.php

    Изменение оформления при помощи CSS
    Например, вы хотите оформить колонку "Скидка" жирным шрифтом. Для этого добавьте в файл /scif/style.css следующий стиль:
    #list.doclist table td:nth-child(7) {font-weight:bold}
    После внесения измений в файл стилей, не забудьте очистить кэш браузера (обновите страницу по CTRL+F5).
  • Как настроить свои периоды в отчетах?
    Вы можете настроить в отчете период по умолчанию при помощи параметра 'period' в массиве $scif_reps. Значение period – это ключ из массива $report_periods: 1-Сегодня, 2-Вчера, 3-7 дней, 4-30 дней, 5-С начала недели, 6-С начала месяца, 7-Этот месяц, 8-Предыдущий месяц, 9-Весь период (вы можете добавить собственные периоды).
    Например, для отчета "Продажи" зададим период "Вчера":
    $scif_reps[8]['period']=2;

    Вы также можете передавать период в отчет через адресную строку браузера. Передача параметра period по ссылке имеет приоритет перед параметром в настройках массива. Ссылка для отчета "Продажи" за "Вчера":
    /scif/?act=reports&t=8&period=2

    Вы также можете передавать в отчет по ссылке не период, а конкретные даты. Например:
    /scif/?act=reports&t=8&date1=01.03.2021&date2=31.03.2021

    Напомним также, что в отчет по ссылке можно передавать и любые другие параметры. Например, отчет "Продажи" с группировкой по контграгентам:
    /scif/?act=reports&t=8&type_group=6

    А если добавить к ссылке параметре &submit, отчет сразу будет сформирован (не нужно будет нажимать кнопку "Сформировать" вручную).

    Хранить созданные ссылки можно в блоках "Объявление", "Заметки" или меню на главной странице системы.
  • Как добавить единицы измерения и другие служебные справочники?
    Служебные справочники, такие как единицы измерения, ставки НДС, упаковки, валюты и др. определены в файле /scif/index.php. Вы можете дополнить или переопределить их, добавив массивы в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода). Например, для добавления нужных единиц измерения, добавьте следующий массив:
    $scif_units=array('шт'=>array('code'=>796),'рул'=>array('code'=>736));
    и т.д., где code - это код ОКЕИ, он используется для вывода в печатных формах.
  • Как изменить меню на главной странице
    Вверху на главной странице выводится меню, в котором вы можете удалять, изменять или добавлять собственные пункты. Для этого нужно добавить в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) функцию my_frontpage_menu().
    Настраиваемое меню

    В дистрибутивном варианте массив меню выглядит следующим образом:
    $menu2['create']=array('Создать<i class="si si_arrow"></i>','','','','item_new');
    $menu2['create']['submenu'][0]=array('Продажа','','Создать Продажу','','trade','actitem=`docitem`;t=2;edit_item(`new`)');
    $menu2['create']['submenu'][1]=array('Оплата','','Внести оплату покупателя','','fin','actitem=`finitem`;t=21;edit_item(`new`)');
    $menu2['create']['submenu'][2]=array('Товар','','Создать новый товар','','noms','actitem=`spritem`;t=5;edit_item(`new`)');
    $menu2['create']['submenu'][3]=array('Клиент','','Внести нового контрагента','','contrs','actitem=`spritem`;t=6;edit_item(`new`)');
    $menu2['create']['submenu'][4]=array('Задача','','Создать новую задачу','','tasks','actitem=`taskitem`;t=0;edit_item(`new`)');
    $menu2['tasklist']=array('Задачи','?act=tasklist','Управление задачами и поручениями','','tasks');
    $menu2['changepwd']=array('Пароль','?act=changepwd','Изменить свой пароль для входа в систему','','lock');
    $menu2['logout']=array('Выход','?act=logout','Завершить сеанс работы','','exit');
    
    Примеры его изменения при помощи функции my_frontpage_menu():
    function my_frontpage_menu() {
    global $menu2, $userdata;
    // Удалим подпункт Создать-Задачи
    unset($menu2['create']['submenu'][4]);
    // Удалим пункт Задачи
    unset($menu2['tasklist']);
    // Добавим пункт Избранное с подпунктами
    $menu2['my']=array('Избранное<i class="si si_arrow"></i>','','','','star');
    $menu2['my']['submenu'][0]=array('Товары','?act=sprlist&t=5','Справочник номенклатуры','_blank','noms');
    $menu2['my']['submenu'][1]=array('Клиенты','?act=sprlist&t=6','Справочник контрагентов','_blank','contrs');
     if ($userdata['role']==1) { // этот пункт только для роли с кодом 1
     $menu2['my']['submenu'][2]=array('Продажи','?act=reports&t=8&type_group=6','Отчет по продажам','_blank','articles');
     }
    }
  • Как отредактировать контекстное меню "Действия"
    На странице просмотра справочников вы можете добавить вверху меню "Действия" для доступа к часто выполняемым действиям с элементами этого справочника. В дистрибутиве такое меню создано для справочника "Контрагенты" и включает пункты "Взаиморасчеты", "Задачи" и "Почта". Вы можете изменять и добавлять собственные пункты для этого и любых других справочников.
    Например, мы хотим автоматизировать документ выписки документа "Изъятие средств", который используем для выдачи зарплаты сотрудника. Сделаем в справочнике "Пользователи" пункт меню "Зарплата". Для этого добавим в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) следующую строку:
    $sprs[2]['actions'][1000]=array('name'=>'Зарплата', 'url_start'=>'?act=finitem&t=24&def[finitem]=3&def[manager]=', 'url_end'=>'', 'desc'=>'Документ на выдачу зарплаты');
    После клика на выбранный пункт, будет открываться новая вкладка с адресом, содержащим переменную url_start, затем код выбранного элемента справочника, затем url_end. В данном примере в url_start мы указываем, что нужно открыть финансовый документ (act=finitem) типа "Изъятие" (t=24) и передаем в него данные для заполнения в массиве def (def[finitem] - статья движения, def[manager] - ответственный, в него и подставится код выбранного пользователя)
  • Как добавить свой код или элементы на страницы
    Для добавления собственного произвольного кода или элементов на страницы, вы можете в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) использовать следующие функции:
    - scif_before_act() - будет выполняться ДО обработки страницы
    - scif_after_act() - будет выполняться ПОСЛЕ обработки страницы
    - scif_meta() - в ней можно добавить или изменить CSS и JavaScript страницы

    1. Примеры с функцией scif_before_act() - выполнение PHP-кода перед обработкой страницы или вывод HTML-кода в шапке страницы

    Пример 1.1. Перед отображением страницы "Торговля-Заказы с сайта" загрузим заказы из стороннего движка интернет-магазина (сама загрузка выполняется в отдельном скрипте). Для этого добавьте в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) следующий код:
    function scif_before_act() {
    global $act, $func;
     if ($act=='orderlist' AND !$func) {
     include WN_PATH_INCLUDES.'parts/sync_woocommerce.php';
     }
    }
    

    Пример 1.2. В шапку главной страницы добавим уведомление о каких-либо событиях, например, наличии новых заказов у менеджера:
    function scif_before_act() {
    global $db, $act, $userdata;
     if ($act=='frontpage') {
     $row_d=$db->sql_fetch_assoc($db->sql_query('SELECT COUNT(*) AS ci FROM '.SCIF_PREFIX.'doc WHERE type="11" AND date_insert>'.(time()-24*60*60).' AND manager="'.$userdata['id'].'"'));
      if ($row_d AND $row_d['ci']) {
      echo '<div class="margin" style="background-color:red; color:white; border:1px solid red; padding:3px">
      ВНИМАНИЕ! Есть новые заказы за последние 24 часа. <a href="?act=doclist&f_manager='.$userdata['id'].'">Смотреть</a>
      </div>';
      }
     }
    }
    

    2. Примеры с функцией scif_after_act() - выполнение PHP-кода после обработки страницы или замена HTML-кода сформированной страницы
    HTML-код, созданный страницей, содежится в переменной $body. В этой функции мы можем его изменить или добавить к нему свой код.

    Пример 2.1. Замена кода HTML. У пользователя "Директор" в верхний блок информации на главной странице добавим данные о наличии денег на счетах:
    function scif_after_act() {
    global $db, $act, $body, $userdata;
     if ($act=='frontpage' AND $userdata['id']==1) {
     $balance=$db->sql_result($db->sql_query('SELECT SUM(balance) FROM '.SCIF_PREFIX.'spr_accounts'),0,0);
     $body=preg_replace('#<div id="userdata">(.*?)</div>#s','<div id="userdata">$1. Остатки на счетах: <b>'.$balance.'</b></div>',$body);
     }
    }
    

    Пример 2.2. Выполнение кода PHP или запросов MySQL. После внесения оплаты документа из меню "Финансы-Оплата" проставим полностью оплаченным документам определенную статью движения:
    function scif_after_act() {
    global $db, $act, $row_new;
     if ($act=='finitem' AND !empty($_POST['submit']) AND $row_new['contr']) {
     $db->sql_query('UPDATE '.SCIF_PREFIX.'doc SET `finitem`="100" WHERE `type`="2" AND `contr`="'.$row_new['contr'].'" AND summa<=payment');
     }
    }
    

    Пример 2.3. Добавление HTML-элементов с кодом JavaScript. Добавим в документ ссылку, выполняющую AJAX-запрос для показа предыдущих цен контрагента:
    function scif_after_act() {
    global $act, $body, $v;
     if ($act=='docitem') {
     $body=str_replace('</div></div></form>','<a href="javascript:void(0)" class="spoiler" style="margin-left:20px;" title="Показать предыдущие цены" onclick="prev_prices()">Проверить цены</a>
     </div></div></form>
     <script type="text/javascript">
     function prev_prices() {
     var contr=$("#contr").val();
      if (contr) {
      var nom_ids="";
      $("#items").find("tr[data-nom_id]").each(function(n,element){
      nom_ids=nom_ids + $(element).attr("data-nom_id")+",";})
       if (nom_ids!="") {
       $("#items").find("tr.head td:eq(7)").html("Предыдущие цены");
        $.post("?act=prev_prices", { "nom_ids": nom_ids, "v": '.$v.', "contr": contr } ,function(data){
         $.each(data, function(key,val){
         $("#items").find("tr[data-nom_id="+key+"]").each(function(n,element){
          sel_item=$(element).attr("data-id");
          $(element).find("td:eq(7)").attr("align","left").html(val);
          });
         });
        },"json");
       } else {
       alert("Сначала добавьте в документ товары");
       }
      } else {
      alert("Не указан контрагент!");
      }
     }
     </script>',$body);
     }
    }

    3. Примеры с функцией scif_meta() - добавление и замена CSS и JavaScript
    JavaScript и CSS страницы содежатся в переменной $meta. В этой функции мы можем их изменить или добавить свой код.

    Пример 3.1. Добавление кода JavaScript. Сделаем, чтобы после выбора контрагента в документ автоматически подставлялся заданный ему тип цен. Для получения типа цен делаем AJAX-запрос:
    function scif_meta() {
    global $act, $meta;
     if ($act=='docitem') {
     $meta.='<script type="text/javascript">
     $(document).ready(function() {
      $("#contr").on("change",function() {
       $.get("?act=my_price_type&func="+$(this).val(), function(data) {
       data=parseInt(data);
        if (data>0 && data!=$("#price_type").val()) {
        $("#price_type").val(data).change();
        }
       });
      });
     });
     </script>';
     }
    }
    

    Пример 3.2. Изменение кода JavaScript. В функции расчета скидки заменем округление полученной цены с копеек до целых:
    function scif_meta() {
    global $act, $meta;
     if ($act=='docitem') {
     $meta=str_replace('new_price=my_round(old_price*(1-discount/100),100);','new_price=my_round(old_price*(1-discount/100),1);',$meta);
     }
    }
    
  • Система виджетов/информеров
    Вы можете добавить на главной странице системы учета iframe-виджет, в котором выводить графики, напоминания, уведомления и любую другую информацию. Примеры виджетов можно посмотреть в нашем каталоге. Вы можете установить виджеты из каталога, создавать их сами или заказывать нам. На странице можно разместить несколько виджетов.
    Для размещения виджета добавьте в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) следующий код:
    $my_scif_widgets['my_informer']=array('name'=>'Информер');
    
    В массиве также можно использовать параметры, например:
    $my_scif_widgets['my_informer']=array('name'=>'Мой заголовок','color'=>'orange','position'=>'userinfo','height'=>300);
    Описание параметров:
    color - фоновый цвет заголовка виджета, имя цвета или код #b08112
    position - место размещения виджета, может принимать следующие значения: userinfo - вверху, div_ads - над блоком "Объявления", div_notes - над блоком "Заметки", copyright - внизу.
    roles - коды ролей доступа, которым будет выводиться виджет, например: 1,2
    users - коды пользователей, которым будет выводиться виджет, например: 1,2
    ext_url - куда будет вести иконка "открыть в новой вкладке" в заголовке виджета. По умолчанию она открывает страницу по имени ключа массива (?act=my_informer), но вы можете задать любой свой адрес.
    url - ссылка для фрейма. По умолчанию она открывает страницу по имени ключа массива (?act=my_informer&iframe), но вы можете задать любой свой адрес.
    height - максимальная высота виджета. По умолчанию виджет растягивается по высоте содержимого. Если высота задана, а содержимое виджета её превышает, в виджете будет появляться полоса прокрутки. Используйте этот параметр, например, если в виджете выводится большая таблица, но не хочется занимать ею много места на странице.

Работа в программе

  • Как еще больше упростить ведение учета?
    В СКИФ есть несколько возможностей для быстрого ввода документов:

    - изменение вида любого документа.
    Например, вы ввели документ "Заказ покупателя" и отправили его заказчику. Документ "Заказ покупателя" не изменяет остатков товара на складе и задолженности покупателя. После оплаты заказа (или подтверждения заказа покупателем), вам нужно произвести отгрузку товара по данному заказу, т.е. выписать расходный документ "Продажа". Для этого вам не нужно вводить новый документ, просто зайдите в ранее выписанный документ "Заказ покупателя", измените его вид на "Продажа" и всё! После этого остатки на складе по присутствующим в документе позициям уменьшатся, а задолженность контрагента увеличится на сумму документа.

    - создание любых документов копирование существующих.
    Если для примера выше вам нужно сохранить для истории документ "Заказ покупателя" (например, чтобы иметь возможность сравнивать количество заказанного товара с фактически отгруженным), вы можете не изменять тип документа "Заказ покупателя", а создать документ "Продажа" копированием. Для этого выберите в журнале нужный документ и нажмите иконку с зеленым плюсиком. Будет открыт новый документ, в котором вам нужно только изменить вид документа.
    Обратите внимание, что в отличие от 1С, где копирование документов возможно только для заранее определенных связанных документов, в СКИФ вы можете скопировать и изменить вид любого документа. Например, если вы делаете закупку у поставщика под конкретный заказ покупателя, вам нужно ввести позиции в документ только один раз. Далее создавайте нужные документы "Продажа", "Заказ поставщику" (если вы его используете) или сразу "Покупка" (оприходование товаров от поставщика) простым копированием ранее созданного документа.
    Если вы создаете приход от поставщика по заказу покупателя, нажмите иконку "Добавить копированием" и в новом документе просто измените шапку документа (вид документа, контрагент, дату и тип цен).

    - предзаполнение новых документов.
    Кроме копирования документов, вы можете передать данные для заполнения новых документов в массиве def в адресной строке и разместить ссылку, например, на главной странице в блоке "Объявления" (будет доступна всем пользователям) или в блоке "Заметки" (будет доступна только вам) или в меню.
    Например, вы выдаете экспедиторам командировочные по документу "Изъятие". Чтобы не заполнять каждый раз в новом документе поля "Статья движения", "Организация", "Касса", "Сумма" и другие, вы можете создать ссылку вида ?act=finitem&t=24&def[org]=1&def[finitem]=6&def[account]=1&def[summa]=500, тогда все перечисленные поля в новом документе уже будут заполнены.
    Вы также можете передать для заполнения коды одного или нескольких товаров через параметр def[items]=n,m
    Например, по следующей ссылке будет создан документ продажа (t=2) контрагенту с кодом 2 (def[contr]=2) и в документ будет автоматически добавлен товар с кодом 1 (def[items]=1):
    ?act=docitem&t=2&def[contr]=2&def[items]=1
    Вы также можете добавить эти параметры в меню "Действия". Например, чтобы автоматически добавлять в документ товар с кодом 1 при создании "Продажи" из меню "Действия" справочника контрагентов, добавьте в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) следующий код:
    $sprs[6]['actions'][1]=array('name'=>'Продажа','url_start'=>'?act=docitem&t=2&def[items]=1&def[contr]=','url_end'=>'','desc'=>'Выписать расходную накладную','ico'=>'trade');

    - импорт документов из Excel.
    Вы можете создавать любые документы импортом из Excel:
    • заказы покупателей, заполненные в вашем прайс-листе,
    • документы от поставщиков, содержащие артикулы или штрихкоды,
    результаты инвентаризаций или внесение начальных остатков
    Импорт позволяет существенно ускорить и сократить количество ошибок при вводе документов.

    - интерфейс продавца-кассира.
    Интерфейс продавца-кассира представляет собой упрощенную форму документа "Продажа" с минимальным набором полей (задается в настройках). В интерфейсе также доступен расчет сдачи покупателю при оплате наличными. Это упрощает работу продавца, устраняет возможные ошибки, сокращает время на обучение работе новых продавцов. Подробнее о модуле.

    - автоматизация любых процессов.
    Поскольку, в отличие от облачных сервисов, программа размещена на вашем сайте или вашем компьютере, вы можете дорабатывать её под свои персональные потребности для автоматизации часто выполняемых вами действий. Персональная доработка может значительно упростить и облегчить вам ведение учета. Напишите нам на адрес biz@webnice.biz для получения консультации.
  • Контроль за удалениями и изменениями в документах
    Чтобы вы имели надежный контроль и защиту от случайных или преднамеренных действий (выполняемых работниками в корыстных целях), в СКИФ большое внимание уделено контролю за изменениями в документах:

    Доступ к удалению документов
    По умолчанию удалять документы может только пользователь с ролью "Руководитель". Роли "Управляющий" разрешено удалять только счета. Остальные пользователи не могут удалять документы. Если документ нужно аннулировать, им следует выполнять обнуление табличной части документа (см. о нем ниже). В большинстве случаев запрет удалений не создает неудобств, позволяет наглядно контролировать изменения и предотвратить случайные или намеренные удаления. Вместе с тем, если вам требуется изменить права доступа к удалениям, вы можете сделать это в скрипте /scif/includes/aut.php.

    Разрешенный срок редактирования
    В настройках пользовательской роли доступа есть параметр "Доступный период редактирования в днях". Вы можете задать его, чтобы ограничить возможность сотрудников изменять старые документы. Например, продавцу запретить менять документы старше 1-2 дней.
    А в меню Сервис-Настройки есть параметр "Дата запрета редактирования" отдельно для складских и финансовых документов. Установить дату запрета редактирования может только "Руководитель", а действовать запрет будет для всех пользователей, включая самого "Руководителя" и "Управляющего". Устанавливайте эту дату после проведения сверок/инвентаризаций/сдачи бухгалтерской отчетности и в других случаях, когда нужно запретить всем сотрудникам изменение документов "закрытого" периода.

    Обнуление товара в документе вместо удаления
    По умолчанию, товар из сохраненного документа удалить нельзя, можно только обнулить его количество. В печатных формах такие обнуленные позиции не выводятся, поэтому ничем не мешают. Но позволяют легко контролировать удаления (а это самый частый способ "махинаций" продавцов), т.к. позиции остаются видны в самом документе и в отчете "Склад-Карточка движения".
    Если вам, тем не менее, хочется, чтобы обнуленные строки из документов удалялись, добавьте в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) следующую строку:
    $del_nulled_rows=array(); // для всех пользователей
    Если нужно удалять только при сохранении определенными пользователями, внесите их коды в массив:
    $del_nulled_rows=array(1,2);

    История изменения документов
    Если складской документ был изменен, внизу документа появляется строка "Изменен" с информацией о времени изменения и пользователе, который эти изменения внёс. При клике на ссылку "Изменен" можно посмотреть, какие поля документа или товары были изменены.
    Настроить период хранения истории изменений можно в параметре doc_history массива $scif_bases в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) (по умолчанию 365 дней).

    Отчеты об изменениях и удалениях
    В меню "Отчеты-Склад" есть несколько отчетов, которые помогут найти внесенные изменения/удаления по заданным фильтрам:
    - Удаленные документы. Показывает удаленные документы за выбранный период по выбранным складам.
    - Исправления. Показывает все измененные документы за выбранный период по выбранным складам.
    - Карточка движения. Поможет разобраться, когда возникают вопросы об остатках товара на складе (когда и сколько поступило и куда отгружено).
  • Как оформлять возвраты?
    В СКИФ нет отдельного документа "Возврат". Для оформления возвратов от покупателя мы рекомендуем использовать пару документов "Покупка" и "Оплата поставщику" (как если бы вы покупали товар у покупателя). Если деньги выдаются в день возврата, оплату можно внести сразу в документе "Покупка". Этот процесс автоматизирован в обработке, доступной из меню "Торговля-Возврат". Для её использования пользователю не требуется давать права на создание документа "Покупка".
    Если деньги не возвращаются покупателю, а за счет возврата товара нужно погасить долг покупателя по другим его накладным или оставить предоплатой, отметьте это в форме и обработка создаст также документ "Оплата от покупателя".
    По умолчанию, система предлагает зачет долга, если у клиента есть долг. Чтобы всегда предлагать зачет, даже если долга нет, добавьте в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) строку:
    $scif_actions[70]['type_refund']=1; // всегда предлагать зачет долга вместо возврата денег

    Если вы используете онлайн-кассу, после создания документа "Покупка" пробейте чек по кнопке "Возврат продажи" из обработки. Его также можно пробить вручную из меню "Финансы-Фиск.регистратор" с указанием номера созданного документа "Покупка".

    Для оформления возвратов от вас поставщику, вместо "Покупка" и "Оплата поставщику" используйте обратную пару - "Продажа" и "Оплата от покупателя".

    Другие способы
    Если данные документы для возвратов вам по каким-либо причинам не подходит, вы можете использовать:
    1) Удаление возвращаемого товара из накладной продажи (найти по какой накладной был продан товар, можно в отчете "Склад-Карточка движения").
    Если вы используете онлайн-кассу, для данного способа из меню "Финансы-Фиск.регистратор" пробейте чек по кнопке "Возврат продажи" с указанием номера документа "Продажа" до удаления возвращаемых товаров, затем удалите товары и затем пробейте чек с новым составом товаров (если возвращаются все товары из документа, второй чек пробивать уже не нужно).
    Минусы способа: не видно движение товара по датам, что может быть неудобным кладовщикам при инвентаризации, если со времени возврата прошло много времени. К изменениям старых накладных также обычно негативно относится бухгалтерия.
    2) Пару документов "Оприходование" и "Изъятие денег".
    Минусы способа: нет прямой привязки оплаты к складскому документу "Оприходование" и возврат не виден в сверке с контрагентом.
    У рекомендуемого нами выше способа использования для возврата пары "Покупка"+"Оплата поставщику" этих недостатков нет.

    Напишите нам, если вам нужна обработка, автоматизирующая создание данных документов по вашим требованиям.
  • Как оформлять производственные операции?
    Для любого товара по ссылке из его карточки вы можете создать список комплектующих (или "технологическую карту") для использования в процедуре комплектации/раскомплектации (меню Склад-Комплектация). Эта процедура создает две складские накладные: 1) списания комплектующих и 2) оприходования комплектов (или наборот). Процедуру можно выполнять как по заданным спискам комплектующих, так и вручную (если эти списки у вас непостоянны).
    Примеры использования:
    - Производство: списываете материалы, приходуете готовую продукцию
    - Комплектация: списываете комплектующие, приходуете комплекты
    - Расформирование: списываете наборы, приходуете их составляющие
    и т.п.

    Если требуется заранее создавать заказы на производство, это можно делать при помощи документов "Склад-Внутренний заказ". Затем в процедуре "Склад-Комплектация" выбрать "Загрузить из документов" и указать номер документа "Внутренний заказ" (или номера сразу нескольких документов). Система выполнит оприходование комплектов (готовой продукции) и списание комплектующих (материалов).

    Для использования процедуры комплектации/раскомплектации пользователю не требуется предоставлять права на создание документов "Списание" и "Оприходование".
  • Как учитывать товары на консигнации (комиссионную торговлю)?
    Для сохранения простоты "фундамента" системы, в СКИФ нет отдельных документов для учета комиссионной торговли. Для её оформления мы рекомендуем использовать следующий механизм:

    1. Создайте отдельный склад "Консигнация" (меню Справочники-Склады). Если вы принимаете один и тот же товар на реализацию от разных поставщиков, необходимо будет создать отдельный склад для каждого поставщика. Если у каждого товара свой поставщик, достаточно одного склада для всех поставщиков. Этот склад/склады будут "виртуальными", расходный документ покупателию будет оформляться с одного склада - вашего.
    2. При получении товара от поставщика, создавайте документ "Перемещение" со склада "Консигнация" на свой склад. При этом на складе "Консигнация" образуется отрицательный остаток, а на вашем положительный.
    3. Продажу товара покупателям оформляйте со своего склада, остаток на нем будет уменьшаться.
    4. Разница между количеством товара на вашем складе и складе "Консигнация" являются основой для составления консигнационного отчета, формируйте его по согласованному с поставщиком графику. По данным отчета, создайте на это количество документ "Покупка" на склад "Консигнация", отрицательный остаток на нем "погашается". Документ "Покупка" формирует у вас задолженность перед поставщиком, оплату задолженности оформляйте документами "Оплата поставщику".

    Таким образом, вы легко видите текущий статус по каждому товару. Остатки товара на складе "Консигнация" показывают, сколько всего не выкуплено товара у поставщика. Остаток на вашем складе показывает сколько товара фактически в наличии. А разница между остатками на складе "Консигнация" и вашим складом означает, сколько вы продали, но еще не отразили в консигнационном отчете.

    Если, напротив, вы предлагаете покупателям товары на консигнацию, схема остаётся той же, только меняется направление перемещения и вместо документа "Покупка" используется документ "Продажа" (Перемещение делаете со своего склада на склад "Консигнация", а когда покупатель предоставляет консигнационный отчет, выписывайте документ "Продажа" на клиента со склада "Консигнация").
  • Как учитывать подарки, сертификаты, абонементы, купоны и т.п.?
    В СКИФ есть несколько возможностей учета отпуска товаров/услуг со скидкой или бесплатно:

    1. Нулевая цена товара

    Если товар/услуга предоставляются клиенту бесплатно, можно в документе «Продажа» просто установить товару нулевую цену. Этот вариант можно использовать, например, для акций "второй товар в подарок" и т.п. Плюсы варианта – простота использования. Минусы, по сравнению с вариантами, описанными ниже - более сложный контроль отгрузок бесплатного товара. Но вы можете создать для целей такого контроля пользовательский отчет.

    2. Специальный вид документа "Бонус"

    В СКИФ есть два типа документов, которые по умолчанию не активированы. Это "Бонус от поставщика" и "Бонус покупателю". Эти документы изменяют остатки на складе, но не изменяют задолженности контрагента. Т.е. при выписке товара в таком документе покупателю, количество товара на складе уменьшится, а сумма долга покупателя не увеличится. Этот вариант хорошо подойдет для отгрузок подарков покупателям, получения бонусной продукции/рекламных материалов от поставщика, оказания услуг по абонементам и сертификатам (напишите нам, если вам требуется модуль автоматического пересчета баланса сертификатов и абонементов).
    Нюанс данного варианта - отгрузку товара нужно оформлять в системе отдельным документом. Плюсом является наглядный учет бонусных отгрузок, их можно отфильтровать в журнале складских документов, выбрав в меню "Склад" нужный тип документа. Чтобы активировать в СКИФ использование документов "Бонус", добавьте в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) следующую строку(и):
    $docs[5]=array('name'=>'Бонус+','desc'=>'Подарок от поставщика','menu'=>3,'target'=>1,'cat'=>'store','price_type'=>1,'table_det'=>'doc');
    $docs[6]=array('name'=>'Бонус-','desc'=>'Подарок покупателю','menu'=>3,'target'=>-1,'cat'=>'store','price_type'=>2,'table_det'=>'doc');
    

    3. Минусовая цена

    Для уменьшения стоимости документа вы можете добавить в него товар/услугу с минусовой ценой. Этот способ хорошо подойдет для учета купонов, ваучеров, бонусных баллов, промокодов и т.п., когда нужно сделать клиенту скидку в документе без распределения её на цену товара. Плюсы способа – простота и наглядность.
    Для использования включите в меню «Сервис-Настройки» опцию «Разрешить минусовые цены» и создайте в справочнике номенклатуры нужные вам услуги, например, «Скидка», «Купон», «Корректировка цены» и т.п.

    4. Оплата на отдельный счет

    Этот вариант подойдет для учета подарочных сертификатов, бонусных баллов и других случаев, когда требуется возможность погашения как полной стоимости документа, так и её части. Заведите в справочнике «Счета и кассы» отдельный счет и вносите на него оплатой нужную часть суммы документа. Суммы, внесенные на это виртуальный счет легко доступны для анализа и контроля в журнале финансовых документов (используйте фильтр по кассе), отчетах, а накопительный баланс в справочнике «Счета и кассы».
  • Как продавать маркированные товары (Честный знак)?
    Если вы торгуете товарами, подлежащими обязательной маркировке, добавьте в документ поле для указания кода маркировки ("Честный знак"), данные будут передаваться в фискальный регистратор (убедитесь, что прошивка вашего фискального регистратора уже обновлена до версии, поддерживающей работу с маркировкой).
    1. Для добавления поля в базе данных выполните SQL-запрос (это можно сделать через /admin/phpmyadmin/):
    ALTER TABLE `wn_scif1_doc_det` ADD `gs1` VARCHAR( 128 ) NOT NULL DEFAULT "";
    
    2. Добавьте в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) следующий код:
    $docitem_userfields['gs1']=array('name'=>'Код маркировки');
    
    После этого в табличной части документа появится поле "Код маркировки", в него нужно сканировать коды с упаковки. Обратите внимание, что если вы продаете несколько единиц маркированного товара, необходимо добавлять их в документ несколькими строками по 1 штуке.
    Если маркировка принимается фискальным регистратором корректно, на электронном чеке после названия товара будет выводиться код маркировки, а на бумажном буква [M].
    На странице "Финансы-Фискальный регистратор" есть кнопка для проверки корректности кода маркировки на товаре. Подробнее
  • CRM (управление взаимоотношениями с клиентами)
    В СКИФ можно хранить развернутые данные по клиентам и проводить их сегментацию по самостоятельно задаваемым критериям.
    По каждому клиенту возможен просмотр истории и формирование сверки взаиморасчетов.
    Есть возможность отправки почты прямо из программы и функционал маркетинговой Email-рассылки.
    Вы можете использовать встроенную систему задач и поручений для напоминаний о необходимости выполнить запланированные дела, совершить звонки и т.п.
    В личном кабинете на сайте клиенту доступны данные о выписанных документах, сумме задолженности, возможность импортировать документы для загрузки и др.
    В скрипте /cron/reminders.php приведен пример организации автоматической рассылки клиентам уведомлений о наступлении задолженности, предстоящей отгрузке и т.п.
    Вы также можете автоматически вносить в систему дату о последнем контакте с контрагентом на основе данных вашей переписки в почтовом ящике.
    К справочнику контрагентов можно добавлять подчиненные справочники, например, контактные лица.
    Вы можете хранить историю контактов с клиентами.
    Вы можете интегрировать СКИФ с внешней системой, например, облачной АТС.
    Это лишь некоторые из возможностей СКИФ, которые позволят вам эффективнее работать с клиентами и поддерживать их лояльность. Вы можете дополнять систему любыми новыми возможностями, которые вам потребуются, самостоятельно или заказывая нам.
  • Разноска авансовых платежей и переплат
    Для внесения предоплаты от покупателя используйте документ "Финансы-Оплата покупателя". После того, как будет создан документ "Продажа", можно сделать разноску оплаты на этот документ:
    - автоматически: зайдите в меню "Сервис-Проверка оплат", нажмите "Выполнить". Если будут обнаружены переплаты, внизу будет кнопка "Выполнить автоматическую разноску переплат". Эта процедура выполнит перенос переплат и авансов на неоплаченные "Продажи" в хронологической последовательности.
    Вы также можно поставить выполнение этой процедуры в планировщик, для этого добавьте выполнение скрипта /cron/auto_overpay.php в CRON через панель управления хостинга по нужному вам расписанию, например, раз в сутки.
    - вручную: откройте ранее созданный документ "Оплата покупателя" и разнесите сумму на нужные документы. Обратите внимание, что общая сумма принятой оплаты в поле вверху не должна при этом измениться! Если сумма документа "Продажа" меньше суммы принятой оплаты, остаток суммы укажите в строке "Без разноски (предоплата)".
    Ручную разноску имеет смысл использовать, только если важно внесение оплат на документы не в хронологическом порядке, в других случаях используете автоматическую разноску.

    В независимости от того, сделали вы разноску переплат на "Продажи" или нет, баланс контрагента будет отображаться корректно. Разноска влияет лишь на то, будет ли заполнено поле "Оплачено" в журнале документов "Продажа". Разноска также учитывается для формирования некоторых отчетов.
  • Мультивалютный учет
    Если вы получаете документы от поставщика в валюте или вам нужно выставлять в валюте счета покупателям, вы можете использовать следующие возможности системы:
    1) В справочнике цен можно создать несколько типов цен, например, Долларовые и Рублевые. Соответственно, для каждого товара указывать цену и в рублях и в долларах (или автоматически пересчитывать по курсу ЦБ при помощи модуля). Документы тоже можно выписывать в разных ценах. Например, счет на оплату выписывать в долларах, а когда он оплачен, выписывать накладную уже в рублях по текущему курсу. Вы также можете создать собственную печатную форму, в которых цены будут указаны в нескольких валютах.
    Для использования разных валют, укажите нужные вам в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода). Например:
    $scif_currencies=array('643'=>array('name'=>'руб'),'840'=>array('name'=>'USD'),'978'=>array('name'=>'EUR'));
    
    2) В документе есть возможность пересчета цен до заданному коэффициенту. Например, поставщик прислал вам инвойс в валюте. Вводите его в документ "Покупка" с ценами в валюте из документа поставщика, затем выберите внизу документа ссылку "Курс" и укажите текущий курс. Цены будут пересчитаны в рубли.
  • Отправка электронной почты
    В СКИФ есть возможность отправки электронной почты прямо из программы. Вы можете использовать эту возможность, чтобы не раздавать всем сотрудникам пароли от корпоративного почтового ящика, а также вести учет отправленных писем. Вы также можете создать различные шаблоны для автоматизации отправки однотипных писем.
    Если в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) указать параметры доступа к вашему SMTP-серверу, то почта будет отправлять через него и, следовательно, все письма, отправленные из программы, будут автоматически появляться в папке "Исходящие" вашего почтового ящика. Параметры доступа к SMTP-серверу необходимо указывать в массиве $mail_smtp. Пример для GMail:
    $mail_smtp=array('host'=>'smtp.gmail.com', 'username'=>'yourname@gmail.com', 'password'=>'yourpass', 'port'=>465);
  • Работа со штрихкодами
    СКИФ поддерживает полноценную работу со штрихкодами товаров. Штрихкоды позволяют упростить поиск товара, добавление товаров в документ, приемку товара, проведение инвентаризаций.
    Мы рекомендуем приобретать сканер со способом подключения "в разрыв клавиатуры", для подключения таких сканеров обычно не требуется никаких настроек, просто подключайте их к компьютеру и можно работать.

    Опробовать работу со штрих-кодами можно даже без покупки сканера при помощи мобильного телефона с Android и программы "Штрих-код Комбайн" (Barcode Harvester) (бесплатна 3 месяца).
    Подробнее об использовании телефона как сканера штрихкодов.
  • Проведение инвентаризаций
    Вы можете проводить инвентаризации при помощи специального модуля. Он позволяет хранить данные ревизий в базе и вносить остатки со сканера штрихкода.
    Инструкция по проведению ревизии при помощи модуля

    Если хранение данных в базе и внесение данных со сканера вам не требуется, инвентаризацию можно провести при помощи Excel.
    Инструкция по проведению ревизии при помощи Excel
  • Печать на принтер по умолчанию
    Настройки безопасности браузера таковы, что при нажатии кнопки печати сначала всегда появляется окно выбора принтера, даже если в системе установлен всего один принтер. Если вы печатаете много документов или ценников, вам может быть удобным настроить печать сразу на принтер, без вывода подтверждающего окна. Для этого нужно изменить настройки браузера.
    В Mozilla Firefox в новой вкладе введите в адресной строке about:config, появится список настроек. Кликните в любом его месте правой кнопкой мыши и выберите "Создать-Логическое". Введите имя настройки print.always_print_silent и значение true. Это всё, теперь при нажатии кнопки "Печать" (или комбинации клавиш CTRL+P) печать из браузера будет происходить сразу на принтер.
    В Google Chrome в ярлык запуска браузера добавьте параметры --enable-kiosk-mode --kiosk-printing
  • Массовое копирование логотипов с внешних URL
    Если Вам нужно массово скопировать логотипы номенклатуры с внешних URL-адресов, например, со своего старого сайта или сайтов своих поставщиков, проделайте следующее:
    1. Добавьте поле logo_url в справочник номенклатуры:
    ALTER TABLE `wn_scif1_spr_noms` ADD `logo_url` VARCHAR(255) NOT NULL DEFAULT "";
    2. Загрузите URL-адреса логотипов из файла Excel через меню "Справочники-Импорт из Excel" или напрямую через базу данных. Пример файла для импорта
    3. Запустите в базе данных специальную обработку по адресу /scif/?act=logo_url. Она проверит товары, у которых проставлены адреса в поле logo_url, но еще не создан логотип и создаст логотипы из указанных URL-адресов.
    Если в последующем массового копирования не планируется, поле logo_url после этого из таблицы можно удалить.
  • Учет накладных расходов в ценообразовании и расчете прибыли
    Если ваши закупки сопровождаются дополнительными расходами, например, на транспорт, таможенное оформление или др., вы можете учитывать эти расходы в расчете цен и прибыли. По умолчанию, эта возможность в системе выключена, чтобы активировать её проделайте следующее:
    1. Добавьте в таблицу деталей документа поле price_over
    ALTER TABLE `wn_scifN_doc_det` ADD `price_over` DECIMAL(10,2) UNSIGNED NOT NULL DEFAULT "0.00"
    2. Раскомментируйте в файле настроек wn_settings.php в корне установки системы (файл можно редактировать из меню Редактор кода) константу PRICE_OVER.
    После этого рядом с полем "Накладные расходы" в складском документе появится ссылка "Разнести по позициям". Суммы, введенные на странице разноски, будут участвовать в расчете цен и прибыли. Подробная инструкция по разноске накладных расходов
Не нашли ответа на свой вопрос? Спросите у нас по email biz@webnice.biz или в мессенджере
Закажите систему учета СКИФ из формы заказа или отправив письмо на адрес biz@webnice.biz